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/