1. 程式人生 > >002.Kubernetes簡單入門例項

002.Kubernetes簡單入門例項

一 環境準備

1.1 基礎環境

Kubernetes模式:單機版

系統環境:CentOS 7/172.24.9.157

部署方式:yum快速部署

其他設定:開啟NTP、關閉防火牆及SELinux

二 部署過程

2.1 安裝軟體

  1 [root@k8s ~]# yum -y install etcd kubernetes
  2 [root@k8s ~]# vi /etc/sysconfig/docker
  3 OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false' #修改OPTIONS值

2.2 前期準備

  1 [root@k8s ~]# systemctl start firewalld
  2 [root@k8s ~]# firewall-cmd --zone=public --add-port=30001/tcp --permanent
  3 [root@k8s ~]# systemctl stop firewalld
  4 [root@k8s ~]# systemctl disable firewalld
  5 [root@k8s ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf		#開啟轉發模式
  6 [root@k8s ~]# sysctl -p

提示:必須先放通此埠,然後再次關閉防火牆。

2.3 關閉安全鑑權

  1 [root@k8s ~]# vi /etc/kubernetes/apiserver
  2 KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"	#刪除SecurityContextDeny,ServiceAccount

提示:若不關閉鑑權,可能出現以下報錯:Error creating: No API token found for service account "default"……

2.4 啟動服務

  1 [root@k8s ~]# systemctl start docker etcd.service kube-apiserver kube-controller-manager.service kube-scheduler.service kubelet.service kube-proxy.service
  2 [root@k8s ~]# systemctl enable docker etcd.service kube-apiserver kube-controller-manager.service kube-scheduler.service kubelet.service kube-proxy.service

2.5 新建MySQL RC檔案

  1 [root@k8s ~]# mkdir tomcat_kbs
  2 [root@k8s ~]# cd tomcat_kbs/
  3 [root@k8s tomcat_kbs]# vi mysql-rc.yaml
  4 apiVersion: v1
  5 kind: ReplicationController			#副本控制器RC
  6 metadata:
  7   name: mysql				#RC名稱,全域性唯一
  8 spec:
  9   replicas: 1				#Pod副本期待的數量
 10   selector:
 11     app: mysql				#符合目標的Pod擁有此標籤
 12   template:					#根據此模板建立Pod副本(例項)
 13     metadata:
 14       labels:
 15         app: mysql				#Pod副本擁有的標籤,對應RC的Selector
 16     spec:
 17       containers:				#Pod內容的定義部分
 18       - name: mysql				#容器的名稱
 19         image: mysql:5.6			#容器對應的Docker image
 20         ports:
 21         - containerPort: 3306		#容器應用監聽的埠號
 22         env:				#注入容器內的環境變數
 23         - name: MYSQL_ROOT_PASSWORD
 24           value: "123456"

2.6 釋出MySQL RC

  1 [root@k8s ~]# cd /root/tomcat_kbs/
  2 [root@k8s tomcat_kbs]# kubectl create -f mysql-rc.yaml
  3 [root@k8s tomcat_kbs]# kubectl get rc			#檢視所建立的RC
  4 NAME      DESIRED   CURRENT   READY     AGE
  5 mysql     1         1         1         17s
  6 [root@k8s tomcat_kbs]# kubectl get pod			#檢視Pod情況
  7 NAME          READY     STATUS    RESTARTS   AGE
  8 mysql-w1f6n   1/1       Running   0          10s

提示:通常可能遇到以下錯誤——

錯誤:/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory。

解決:

  1 [root@k8s tomcat_kbs]# yum -y install *rhsm*		#安裝rhsm,並生成pem
  2 [root@k8s tomcat_kbs]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
  3 [root@k8s tomcat_kbs]# 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
  4 [root@k8s tomcat_kbs]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest	#手動pull

提示:相關刪除操作如下:

  1 [root@k8s tomcat_kbs]# kubectl delete -f mysql-rc.yaml
  2 replicationcontroller "mysql" deleted
  3 [root@k8s tomcat_kbs]# kubectl get rc
  4 No resources found.
  5 [root@k8s tomcat_kbs]# kubectl get pods
  6 NAME          READY     STATUS        RESTARTS   AGE
  7 mysql-hgkwr   0/1       Terminating   0          17m
  8 [root@k8s tomcat_kbs]# kubectl delete po mysql-hgkwr
  9 pod "mysql-hgkwr" deleted
 10 [root@k8s tomcat_kbs]# kubectl delete pods --all --grace-period=0 --force	#強制刪除

2.7 建立MySQL Kubernetes Service

  1 [root@k8s tomcat_kbs]# vi mysql-svc.yaml
  2 apiVersion: v1
  3 kind: Service
  4 metadata:
  5   name: mysql
  6 spec:
  7   ports:
  8     - port: 3306
  9   selector:
 10     app: mysql
 11 [root@k8s tomcat_kbs]# kubectl create -f mysql-svc.yaml
 12 [root@k8s tomcat_kbs]# kubectl get svc
 13 NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
 14 kubernetes   10.254.0.1      <none>        443/TCP    16m
 15 mysql        10.254.132.65   <none>        3306/TCP   54s		#Cluster IP

2.8 新建Tomcat RC檔案

  1 [root@k8s tomcat_kbs]# vi myweb-rc.yaml
  2 apiVersion: v1
  3 kind: ReplicationController
  4 metadata:
  5   name: myweb
  6 spec:
  7   replicas: 2
  8   selector:
  9     app: myweb
 10   template:
 11     metadata:
 12       labels:
 13         app: myweb
 14     spec:
 15       containers:
 16       - name: myweb
 17         image: kubeguide/tomcat-app:v1
 18         ports:
 19         - containerPort: 8080

2.9 釋出Tomcat RC

  1 [root@k8s tomcat_kbs]# kubectl create -f myweb-rc.yaml
  2 [root@k8s tomcat_kbs]# kubectl get pods
  3 NAME          READY     STATUS    RESTARTS   AGE
  4 mysql-w1f6n   1/1       Running   0          2m
  5 myweb-82s04   1/1       Running   0          28s
  6 myweb-rsmbq   1/1       Running   0          28s

2.10 建立Tomcat Kubernetes Service

  1 [root@k8s tomcat_kbs]# vi myweb-svc.yaml
  2 apiVersion: v1
  3 kind: Service
  4 metadata:
  5   name: myweb
  6 spec:
  7   type: NodePort
  8   ports:
  9     - port: 8080
 10       nodePort: 30001
 11   selector:
 12     app: myweb
 13 [root@k8s tomcat_kbs]# kubectl create -f myweb-svc.yaml

提示:type=NodePort和nodePort=30001的兩個屬性,表明此service開啟了NodePort方式外網訪問模式。

Service的虛擬IP是由Kubernetes虛擬出來的內部網路,外部是無法定址到的。但是有些服務又需要被外部訪問到,例如web前段。這時候就需要加一層網路轉發,即外網到內網的轉發。Kubernetes提供了NodePort、LoadBalancer、Ingress三種方式。

nodePort,在之前的Guestbook示例中,已經演示了NodePort的用法。NodePort的原理是,Kubernetes會在每一個Node上暴露出一個埠:nodePort,外部網路可以通過(任一Node)[NodeIP]:[NodePort]訪問到後端的Service。

三 測試驗證

3.1 驗證Kubernetes相關資訊

  1 [root@k8s tomcat_kbs]# kubectl get rc
  2 NAME      DESIRED   CURRENT   READY     AGE
  3 mysql     1         1         1         5m
  4 myweb     2         2         2         2m
  5 [root@k8s tomcat_kbs]# kubectl get pod
  6 NAME          READY     STATUS    RESTARTS   AGE
  7 mysql-w1f6n   1/1       Running   0          4m
  8 myweb-82s04   1/1       Running   0          2m
  9 myweb-rsmbq   1/1       Running   0          2m
 10 [root@k8s tomcat_kbs]# kubectl get services
 11 NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
 12 kubernetes   10.254.0.1      <none>        443/TCP          19m
 13 mysql        10.254.132.65   <none>        3306/TCP         3m
 14 myweb        10.254.7.163    <nodes>       8080:30001/TCP   1m

提示:typeNodePort和nodePort=30001,表明此Service開啟了NodePort方式的外網訪問模式。

3.2 瀏覽器測試

http://172.24.9.157:30001/demo

錯誤:若出現以下JDBC報錯可通過以下操作解決:

解決:

  1 [root@k8s ~]# kubectl get ep			#檢視相應IP
  2 NAME         ENDPOINTS                         AGE
  3 kubernetes   172.24.9.157:6443                 21m
  4 mysql        172.17.0.2:3306                   5m
  5 myweb        172.17.0.3:8080,172.17.0.4:8080   3m
  6 [root@k8s ~]# docker ps -a | grep tomcat | awk '{ print $1 }'	#確認容器ID
  7 e5cf7adc32d0
  8 2293bc1cc724
  9 [root@k8s ~]# docker inspect e5cf7adc32d0 | grep hosts
 10 [root@k8s ~]# echo "172.17.0.2 mysql" >> /var/lib/kubelet/pods/362cca88-8b54-11e9-8aec-525400162bb6/etc-hosts
 11 [root@k8s ~]# docker inspect 2293bc1cc724 | grep hosts
 12 [root@k8s ~]# echo "172.17.0.2 mysql" >> /var/lib/kubelet/pods/362ce14d-8b54-11e9-8aec-525400162bb6/etc-hosts

提示:如上報錯原因為舊版本jdbc驅動可用,但是現在yaml檔案中沒有版本號,預設依然是latest,新版jdbc驅動不能連線latest版本的mysql,故需要更改yaml檔案,新增版本(建議使用5.6)。

參考文件:https://blog.csdn.net/lz0635/article/details/