kubernetes學習一:安裝及部署第一個Web應用


准備工作

首先准備Kubernets的環境,使用的是centos7.5

關閉防火牆:

# systemctl disable firewalld
# systemctl stop firewalld

安裝etcd和kubernetes(會自動安裝Docker軟件)

由於centos mini版本沒有ifconfig和netstat的命令。所以安裝了net-tools的工具
# yum -y install net-tools
# yum install -g etcd kubernetes

k8s、etcd和Docker軟件版本查詢

---------k8s信息查詢-------
默認安裝完成以后,看了一下k8s的版本,是v1.5.2# kubectl --version
Kubernetes v1.5.2

[root@spareribs ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}

--------docker信息查詢--------
# docker version  
Client:
 Version:         1.12.6
 API version:     1.24
 Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
 Go version:      go1.7.4
 Git commit:      88a4867/1.12.6
 Built:           Mon Jul  3 16:02:02 2017
 OS/Arch:         linux/amd64

Server:
 Version:         1.12.6
 API version:     1.24
 Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
 Go version:      go1.7.4
 Git commit:      88a4867/1.12.6
 Built:           Mon Jul  3 16:02:02 2017
 OS/Arch:         linux/amd64

------etcd信息查詢-------
# etcdctl --version
etcdctl version: 3.1.9
API version: 2

 

修改配置文件

修改Docker的OPTIONS配置
# vi /etc/sysconfig/docker
# OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'

修改k8s APIserver的配置文件
# vi /etc/kubernetes/apiserver 
# KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

注:不修改后期創建rc與pod的時候會出現pod無法創建但是rc能創建

 

生成rhsm證書文件

# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
# rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
注:創建容器時需要從redhat站點下載pod-infrastructure:latest鏡像,如果沒有此證書文件會報錯,Pod會一直顯示ContainerCreating狀態。

 

配置docker阿里雲鏡像加速

cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF

 

啟動服務

按順序啟動服務

# systemctl start etcd
# systemctl start kube-apiserver
# systemctl start kube-controller-manager
# systemctl start kube-scheduler
# systemctl start kubelet
# systemctl start kube-proxy
# systemctl start docker

查看當前啟動的服務和端口

# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:10250         0.0.0.0:*               LISTEN      2964/kubelet
tcp        0      0 127.0.0.1:2379          0.0.0.0:*               LISTEN      2728/etcd
tcp        0      0 127.0.0.1:2380          0.0.0.0:*               LISTEN      2728/etcd
tcp        0      0 127.0.0.1:10255         0.0.0.0:*               LISTEN      2964/kubelet
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      2906/kube-apiserver
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1353/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1993/master
tcp        0      0 127.0.0.1:10248         0.0.0.0:*               LISTEN      2964/kubelet
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      3008/kube-proxy
tcp6       0      0 :::10251                :::*                    LISTEN      2953/kube-scheduler
tcp6       0      0 :::6443                 :::*                    LISTEN      2906/kube-apiserver
tcp6       0      0 :::10252                :::*                    LISTEN      2941/kube-controlle
tcp6       0      0 :::22                   :::*                    LISTEN      1353/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1993/master
tcp6       0      0 :::4194                 :::*                    LISTEN      2964/kubelet

 

啟動Mysql服務

1、創建mysql的Deployment定義文件
mysql-dep.yaml文件內容如下:

apiVersion: extensions/v1beta1                  #apiserver的版本
kind: Deployment                                      #副本控制器deployment,管理pod和RS
metadata:
  name: mysql                                            #deployment的名稱,全局唯一
spec:
  replicas: 1                                                #Pod副本期待數量
  selector:
    matchLabels:                                         #定義RS的標簽
      app: mysql                                          #符合目標的Pod擁有此標簽
  strategy:                                                  #定義升級的策略
    type: RollingUpdate                               #滾動升級,逐步替換的策略
  template:                                                #根據此模板創建Pod的副本(實例)
    metadata:
      labels:
        app: mysql                                        #Pod副本的標簽,對應RS的Selector
    spec:
      containers:                                          #Pod里容器的定義部分
      - name: mysql                                     #容器的名稱
        image: mysql:5.7                               #容器對應的docker鏡像
        volumeMounts:                                #容器內掛載點的定義部分
        - name: time-zone                            #容器內掛載點名稱
          mountPath: /etc/localtime              #容器內掛載點路徑,可以是文件或目錄
        - name: mysql-data
          mountPath: /var/lib/mysql               #容器內mysql的數據目錄
        - name: mysql-logs
          mountPath: /var/log/mysql              #容器內mysql的日志目錄
        ports:
        - containerPort: 3306                         #容器暴露的端口號
        env:                                                   #寫入到容器內的環境容量
        - name: MYSQL_ROOT_PASSWORD   #定義了一個mysql的root密碼的變量
          value: "123456"
      volumes:                                             #本地需要掛載到容器里的數據卷定義部分
      - name: time-zone                              #數據卷名稱,需要與容器內掛載點名稱一致
        hostPath:
          path: /etc/localtime                        #掛載到容器里的路徑,將localtime文件掛載到容器里,可讓容器使用本地的時區
      - name: mysql-data
        hostPath:
          path: /data/mysql/data                   #本地存放mysql數據的目錄
      - name: mysql-logs
        hostPath:
          path: /data/mysql/logs                    #本地存入mysql日志的目錄
  • apiVersion:定義使用apiserver的哪個版本,可通過kubectl api-versions命令查看apiserver有哪些版本;
  • kind:用來表明此資源對象的類型,比如這里的值為“Deployment”,表示這是一個deployment;
  • spec:RS相關屬性定義,spec.selector是RS的Pod標簽(Label)選擇器,即監控和管理擁有這些標簽的Pod實例,確保當前集群上始終有且僅有replicas個Pod實例在運行,這里設置replicas=1表示只能運行一個Mysql Pod實例。
  • spec.strategy:定義Pod的升級方案,Recreate表示刪除所有已存在的Pod,重新創建新的;RollingUpdate表示滾動升級,逐步替換的策略,滾動升級時支持更多的附加參數,例如設置最大不可用Pod數量,最小升級間隔時間等等。
  • spec.template:當集群中運行的Pod數量小於replicas時,RS會根據spec.template中定義的Pod模板來生成一個新的Pod實例,spec.template.metadata.labels指定了該Pod的標簽,需要特別注意的是,這里的labels必須匹配之前的spec.selector。
  • spec.template.spec.containers:容器的定義部分,包括容器的名稱、使用的docker鏡像、掛載數據卷、服務的端口號、變量等內容。
  • spec.template.spec.volumes:需要掛載到容器里的本地數據卷的定義部分,數據卷的名稱要與容器內掛載點的名稱一致,path定義本地的數據卷路徑。

注:mysql-dep.yaml文件會創建deployment、RS、Pod和容器,創建過程需要先下載鏡像,時間會比較久。


發布Mysql

# kubectl create -f mysql-dep.yaml
deployment "mysql" created

查詢Mysql信息和Pod信息

 
         
# kubectl get deployment 
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
mysql     1         1         1            1           8s
 
# kubectl get rs
NAME               DESIRED   CURRENT   READY     AGE
mysql-3238461207   1         1         1         6m
# docker ps
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES
5252cd76009a        mysql:5.7                                                    "docker-entrypoint..."   55 minutes ago      Up 55 minutes                           k8s_mysql.23f88726_mysql-3238461207-vvwt8_default_72d7bff7-d81c-11e8-a729-000c29dabb02_6b15dcfc
f026e79ddad9        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           55 minutes ago      Up 55 minutes                           k8s_POD.1d520ba5_mysql-3238461207-vvwt8_default_72d7bff7-d81c-11e8-a729-000c29dabb02_668a091e

注:
都是1表示運行正常,特別是第一次拉取容器的鏡像需要一段時間,所以Pod的狀態一開始有可能是Pending,最終才變為Running。

 

查看Pod里容器的時間,檢查時間是否與本地時間一致

# kubectl exec mysql-3238461207-vvwt8 date
Thu Oct 25 15:06:15 CST 2018

注:exec后面跟pod的名稱

 

定義一個Service文件

mysql-svc.yaml文件內容如下:

apiVersion: v1
kind: Service     #表示Kubernetes Service
metadata:
  name: mysql   #Service的名稱
spec:
  ports:
    - port: 3306   #Service提供服務的端口號
  selector:
    app: mysql    #Service對應的Pod的標簽

各個字段說明

  • kind:標明是Kubernetes Services
  • metadata.name:Service的全局唯一名稱
  • spec.ports.port:Service提供服務的端口號
  • spec.selector:Service對應的Pod擁有這里定義的標簽

發布Mysql SVC文件到集群中

# kubectl create -f mysql-svc.yaml
service "mysql" created

查詢SVC文件信息

  • Mysql服務被分配了一個值為10.254.209.200的虛擬IP地址(CLUSTER-IP),Kubernetes集群中創建的Pod就可以通過Services的10.254.209.200(Cluster IP)+ 3306(端口號)來鏈接和訪問
  • Cluster IP由Kubenrnetes自動分配,其他的Pod無法預先知道某個Services的Cluster IP地址
  • Kubenrnetes利用Linux的環境變量(Environment Variable)來解決這個問題,Sevice的名字唯一,容器可以從環境變量中或i渠道Service對應的Cluster IP地址和端口,從而發起TCP/IP鏈接請求

# kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1       <none>        443/TCP          22h
mysql        10.254.209.200   <none>        3306/TCP         7s

 

啟動Tomcat應用

創建tomcat的Deployment定義文件

myweb-dep.yaml文件的內容如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myweb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myweb
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: kubeguide/tomcat-app:v1
        volumeMounts:
        - name: time-zone
          mountPath: /etc/localtime
        - name: tomcat-logs
          mountPath: /usr/local/tomcat/logs
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: '10.254.144.64'               #此處為mysql服務的Cluster IP,需要修改
        - name: MYSQL_SERVICE_PORT
          value: '3306'
      volumes:
      - name: time-zone
        hostPath:
          path: /etc/localtime
      - name: tomcat-logs
        hostPath:
          path: /data/tomcat/logs

發布Tomcat deployment

# kubectl create -f myweb-dep.yaml 
deployment "myweb" created
注:創建過程比較久,請耐心等待,pod的STATUS狀態為Running時表示創建成功。

定義一個Service文件

創建tomcat的Service定義文件,myweb-svc.yaml文件的內容如下:

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30001
  selector:
    app: myweb

注:此Service開啟了NodePort方式的外網訪問模式,端口為30001,此端口會映射到tomcat容器的8080端口上。

發布Tomcat SVC文件到集群中

# kubectl create -f myweb-svc.yaml 
service "myweb" created

查詢Tomcat SVC信息

# kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 23h mysql 10.254.209.200 <none> 3306/TCP 1h myweb 10.254.216.52 <nodes> 8080:30001/TCP 7s

 可使用curl命令測試tomcat服務是否能正常訪問

# curl http://192.168.77.146:30001

通過瀏覽器訪問網頁

1、如果30001端口不通的話,重新啟動、關閉firewalld防火牆

# systemctl start firewalld
# systemctl stop firewalld
注:因為kubernetes會在iptables里添加一些策略,需要再重新開啟關閉防火牆才會關閉掉這些策略。

2、通過瀏覽器訪問http://192.168.77.146:30001/demo/

點擊“Add...”,添加一條記錄並提交

提交以后,數據就被寫入mysql數據庫里了。
3、登陸mysql數據庫驗證

[root@andyxu-test ~]# docker exec -it 5252cd76009a /bin/bash
root@mysql-3238461207-vvwt8:/# mysql -uroot -p123456
mysql> use HPE_APP
mysql> select * from T_USERS;


可以繼續研究下這個例子,比如:

    • 研究RS、Service等文件的格式。
    • 熟悉kubectl的子命令。
    • 手工停止某個Service對應的容器,觀察有什么現象發生。
    • 修改Deployment文件,改變pod副本的數量,重新創建,觀察結果。

 

錯誤整理

在創建rc與pod時出現遲遲無發運行pods狀態如下:

使用kubectl describe pods Pod_Name來查看是什么原因。
其中遇到錯誤為:

# kubectl describe pods mysql-ln2bl
Name: mysql-ln2bl
Namespace: default
Node: 127.0.0.1/127.0.0.1
Start Time: Sat, 24 Aug 2019 17:42:13 +0800
Labels: app=mysql
Status: Pending
IP:
Controllers: ReplicationController/mysql
Containers:
mysql:
Container ID:
Image: mysql
Image ID:
Port: 3306/TCP
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Volume Mounts: <none>
Environment Variables:
MYSQL_ROOT_PASSWORD: 123456
Conditions:
Type Status
Initialized True
Ready False
PodScheduled True
No volumes.
QoS Class: BestEffort
Tolerations: <none>
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
41m 41m 1 {default-scheduler } Normal Scheduled Successfully assigned mysql-ln2bl to 127.0.0.1
40m 22s 177 {kubelet 127.0.0.1} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""

41m 9s 13 {kubelet 127.0.0.1} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"

大致意思就是:未能通過ErrImagePull為“POD”啟動“StartContainer”:“對於registry.access.redhat.com/rhel7/pod-infrastructure:latest,圖像拉出失敗,這可能是因為此請求上沒有證書

檢查發現:/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt這個目錄中是一個軟連接

發現實際上並沒有這個文件

網上說是因為證書導致的, 然后下載一個  yum remove *rhsm* -y  就可以解決,但發現這個rhsm文件被調換了,下載后發現是空的,然后通過下面的方法解決。

解決方法:下載rpm包安裝rhsm

wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

刪除rc與pod 

kubectl delete -f XXX.yaml 或者kubectl delete pods pod_name
詳細使用方法查看 kubectl delete --help

重新創建之后便可已正常運行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM