將k8s安裝在六個節點上,六個點信息為:
節點名稱 | IP地址 | Hostname | 安裝內容 |
---|---|---|---|
harbor私有倉庫 | 192.168.0.101 | yyee-centos-1 | harbor |
k8s管理節點1 | 192.168.0.102 | yyee-centos-2 |
etcd,kube-apiserver,kube-controller-manager,
kube-scheduler,CNI
|
k8s管理節點2 | 192.168.0.103 | yyee-centos-3 |
etcd,kube-apiserver,kube-controller-manager,
kube-scheduler, CNI
|
k8s工作節點1 | 192.168.0.104 | yyee-centos-4 |
etcd ,kubelet,docker,kube_proxy,caliop, CNI |
k8s工作節點2 | 192.168.0.105 | yyee-centos-5 | kubelet,docker,kube_proxy,caliop, CNI |
k8s工作節點3 | 192.168.0.106 | yyee-centos-6 | kubelet,docker,kube_proxy,caliop, CNI |
前期准備,創建kube-proxy證書。在前一篇 《二進制部署k8s集群(三):部署apiserver》已經創建kube-proxy證書。
需要用到兩個證書文件(kube-proxy-client-key.pem, kube-proxy-client.pem),將這兩個證書文件分別拷貝所有管理節點的【/opt/kubernetes/server/bin/certs】目錄,以及拷貝到所有工作節點的 【//opt/kubernetes/node/bin/certs】目錄。
准備kube-proxy證書 |
將【k8s管理節點1】上簽 發的kubelet證書,kube-proxy證書,client證書,私鑰證書ca.pem,拷貝到 所有k8s工作節點下的 【/opt/kubernetes/node/bin/certs】目錄。
mkdir -p /opt/kubernetes/node/bin/certs cd /opt/kubernetes/node/bin/certs scp 192.168.0.102:/opt/certs/kubelet-key.pem ./ scp 192.168.0.102:/opt/certs/kubelet.pem ./ scp 192.168.0.102:/opt/certs/ca.pem ./ scp 192.168.0.102:/opt/certs/client-key.pem ./ scp 192.168.0.102:/opt/certs/client.pem ./ scp 192.168.0.102:/opt/certs/kube-proxy-client-key.pem ./ scp 192.168.0.102:/opt/certs/kube-proxy-client.pem ./
創建kube-proxy用戶配置文件 |
切換到【k8s管理節點2】(192.168.0.103)主機,因為生成配置的時候用到localhost:8080,所以需要在管理節點上執行。
下面4個步驟,只需要在其中一個管理節點上完成,然后將kubelet.kubeconfig文件和k8s-node.yaml文件拷貝到各個工作節點。
進入kubernetes安裝目錄的conf文件夾。
cd /opt/kubernetes/server/conf/
注意,conf目錄在【/opt/kubernetes/server】目錄下面,而不是【/opt/kubernetes/server/bin】。
第1步【設置集群參數】
kubectl config set-cluster myk8s \ --certificate-authority=/opt/kubernetes/server/bin/certs/ca.pem \ --embed-certs=true \ --server=https://192.168.0.102:6443 \ --kubeconfig=kube-proxy.kubeconfig
Cluster "myk8s" set.
第2步【設置客戶端認證參數】
kubectl config set-credentials k8s-proxy \ --client-certificate=/opt/kubernetes/server/bin/certs/kube-proxy-client.pem \ --client-key=/opt/kubernetes/server/bin/certs/kube-proxy-client-key.pem \ --embed-certs=true \ --kubeconfig=kube-proxy.kubeconfig
User "k8s-proxy" set.
第3步【設置上下文參數】
kubectl config set-context myk8s-context \ --cluster=myk8s \ --user=kube-proxy \ --kubeconfig=kube-proxy.kubeconfig
Context "myk8s-context" created.
第4步【切換上下文】
kubectl config use-context myk8s-context --kubeconfig=kube-proxy.kubeconfig
Switched to context "myk8s-context".
第5步 【分發配置文件到工作節點】
將kube-proxy.kubeconfig文件分發到三個工作節點kube-proxy安裝目錄的conf文件夾。
並且還要拷貝到工作節點的 /root/.kube文件夾,以便在工作節點可以使用kubectl命令。
#先在工作節點創建/opt/kubernetes/node/conf文件夾及/root/.kube文件夾 #然后拷貝文件 scp kube-proxy.kubeconfig 192.168.0.104:/opt/kubernetes/node/conf scp kube-proxy.kubeconfig 192.168.0.104:/root/.kube scp kube-proxy.kubeconfig 192.168.0.105:/opt/kubernetes/node/conf scp kube-proxy.kubeconfig 192.168.0.105:/root/.kube scp kube-proxy.kubeconfig 192.168.0.106:/opt/kubernetes/node/conf scp kube-proxy.kubeconfig 192.168.0.106:/root/.kube
加載ipvs模塊 |
(1) 加載ipvs模塊方案1----批處理加載
在所有工作節點上加載ipvs模塊。
切換到工作節點,創建ipvs.sh腳本
vi /root/ipvs.sh
#!/bin/bash ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs" for i in $(ls $ipvs_mods_dir|grep -o "^[^.]*") do /sbin/modinfo -F filename $i &>/dev/null if [ $? -eq 0 ];then /sbin/modprobe $i fi done
賦予腳本可執行權限
chmod +x /root/ipvs.sh
執行腳本前后可以分別使用【lsmod | grep ip_vs】命令查看當前ipvs模塊內容。
執行ipvs.sh腳本加載ipvs模塊:
#執行腳本
sh /root/ipvs.sh
#查看ipvs模塊內容 lsmod | grep ip_vs
(2) 加載ipvs模塊方案2----用文件加載
vi /etc/sysconfig/modules/ipvs.modules
modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- ip_vs_nq modprobe -- ip_vs_seq modprobe -- nf_conntrack_ipv4
兩種加載ipvs方案使用其中一種即可。
部署kube-proxy |
(1) 創建kube-proxy啟動腳本
【創建工作節點1】的kube-proxy啟動腳本
#!/bin/sh ./kube-proxy \ --cluster-cidr 172.17.0.0/16 \ --hostname-override 192.168.0.104 \ --proxy-mode=ipvs \ --ipvs-scheduler=nq \ --masquerade-all=true \ --kubeconfig ../conf/kube-proxy.kubeconfig
--cluster-cidr 表示pod節點的ip地址段,kube-controller-manager.sh啟動文件與kube-proxy.sh啟動文件兩個要配置成一樣。
【創建工作節點2】的kube-proxy啟動腳本
#!/bin/sh ./kube-proxy \ --cluster-cidr 172.17.0.0/16 \ --hostname-override 192.168.0.105 \ --proxy-mode=ipvs \ --ipvs-scheduler=nq \ --masquerade-all=true \ --kubeconfig ../conf/kube-proxy.kubeconfig
--cluster-cidr 表示pod節點的ip地址段,kube-controller-manager.sh啟動文件與kube-proxy.sh啟動文件兩個要配置成一樣。
【創建工作節點3】的kube-proxy啟動腳本
#!/bin/sh ./kube-proxy \ --cluster-cidr 172.17.0.0/16 \ --hostname-override 192.168.0.106 \ --proxy-mode=ipvs \ --ipvs-scheduler=nq \ --masquerade-all=true \ --kubeconfig ../conf/kube-proxy.kubeconfig
--cluster-cidr 表示pod節點的ip地址段,kube-controller-manager.sh啟動文件與kube-proxy.sh啟動文件兩個要配置成一樣。
(2) 執行 kube-proxy腳本
cd /opt/kubernetes/node/bin #添加可執行權限
chmod +x kube-proxy.sh
#執行腳本 ./kube-proxy.sh
如果啟動kube-proxy的時候報錯:
Failed to list *v1.Service: services is forbidden: User "system:anonymous" cannot list resource "services" in API group "" at the cluster scope
解決辦法有兩種方法:
方法1:給匿名用戶授予集群管理權限
在【k8s管理節點】上執行:
kubectl create clusterrolebinding anonymous-cluster-admin --clusterrole=cluster-admin --user=system:anonymous
anonymous-cluster-admin是角色綁定名稱,隨意取名。
重新啟動kube-proxy 。
方法2,修改docker配置文件,增加兩行配置
"exec-opts": ["native.cgroupdriver=systemd"],
"live-restore": true
{ "storage-driver": "overlay2", "registry-mirrors": [ "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com" ], "insecure-registries": ["192.168.0.101:10080","192.168.0.101:10433"], "exec-opts": ["native.cgroupdriver=systemd"], "live-restore": true }
重啟docker
systemctl daemon-reload
systemctl restart docker
為了保證kube-proxy掛掉之后有一個程序自動把kube-proxy再次拉起來,需要把kube-proxy做成systemd服務,或者supervisor來托管kube-proxy。
本例使用supervisor來托管。
使用supervisor啟動kube-proxy |
(1) 安裝supervisor
yum install supervisor
systemctl enable supervisord
systemctl start supervisord
(2) 創建工作節點上的supervisor啟動配置文件
將配置文件放到 /etc/supervisord 目錄下,以.ini作為擴展名,文件名可以任意,可以放置多個不同的啟動配置文件,每個配置文件以不同的服務啟動。
創建【工作節點1】的supervisor啟動文件
切換到192.168.0.104
vi /etc/supervisord.d/kube-proxy.ini
[program:kube-proxy-104] command=/opt/kubernetes/node/bin/kube-proxy.sh numprocs=1 directory=/opt/kubernetes/node/bin autostart=true autorestart=true startsecs=30 startretries=3 exitcodes=0,2 stopsignal=QUIT stopwaitsecs=10 user=root redirect_stderr=true stdout_logfile=/data/logs/kubernetes/kube-proxy/kube-proxy.stdout.log stdout_logfile_maxbytes=64MB stdout_logfile_backups=4 stdout_capture_maxbytes=1MB stdout_events_enabled=false
每個節點除了[program:kube-proxy-104]這一句不一樣,其它配置相同。program的值在不同機器也可以配成一樣。
創建【工作節點2】的supervisor啟動文件
切換到192.168.0.104
vi /etc/supervisord.d/kube-proxy.ini
[program:kube-proxy-105] command=/opt/kubernetes/node/bin/kube-proxy.sh numprocs=1 directory=/opt/kubernetes/node/bin autostart=true autorestart=true startsecs=30 startretries=3 exitcodes=0,2 stopsignal=QUIT stopwaitsecs=10 user=root redirect_stderr=true stdout_logfile=/data/logs/kubernetes/kube-proxy/kube-proxy.stdout.log stdout_logfile_maxbytes=64MB stdout_logfile_backups=4 stdout_capture_maxbytes=1MB stdout_events_enabled=false
創建【工作節點3】的supervisor啟動文件
切換到192.168.0.106
vi /etc/supervisord.d/kube-proxy.ini
[program:kube-proxy-106] command=/opt/kubernetes/node/bin/kube-proxy.sh numprocs=1 directory=/opt/kubernetes/node/bin autostart=true autorestart=true startsecs=30 startretries=3 exitcodes=0,2 stopsignal=QUIT stopwaitsecs=10 user=root redirect_stderr=true stdout_logfile=/data/logs/kubernetes/kube-proxy/kube-proxy.stdout.log stdout_logfile_maxbytes=64MB stdout_logfile_backups=4 stdout_capture_maxbytes=1MB stdout_events_enabled=false
(3) 分別啟動所有工作節點上的kube-proxy服務
在每個工作節點上執行下面命令啟動kube-proxy
#創建日志文件夾 mkdir -p /data/logs/kubernetes/kube-proxy #啟動新加入到supervisor中的服務 supervisorctl update #查看狀態 supervisorctl status
查看kube-proxyt啟動日志
tail -fn 200 /data/logs/kubernetes/kube-proxy/kube-proxy.stdout.log
【supervisor命令說明】
supervisorctl status #查看所有進程的狀態
supervisorctl stop 服務名 #停止服務
supervisorctl start 服務名 #啟動服務
supervisorctl restart 服務名 #重啟服務
supervisorctl update #配置文件修改后使用該命令加載新的配置
supervisorctl reload #重新啟動配置中的所有程序
驗證kubernetes集群 |
驗證從私有Harbor上拉取鏡像創建一個pod驗證kubernetes集群。
前提需要在私有Harbor上創建一個用戶,此用戶可以用來登錄,並把harbor中的某些項目授予此用戶的【項目管理員 】或【項目維護人員】或【開發人員】權限。
(1) 創建secret
在k8s管理節點上創建一個secret,
kubectl create secret docker-registry myharbor-yyee --docker-server=192.168.0.101:10080 --docker-username=yyee --docker-password=Harbor12345 --docker-email=87643666@qq.com
kubectl create secret docker-registry <注冊secret名> --docker-server=<harbor服務器地址> --docker-username=<harbor用戶名> --docker-password=<登錄密碼> --docker-email=<注冊郵箱>
(2) 使用yaml文件創建pod
【創建pod配置文件】
在其中一個【k8s管理節點】上創建pod啟動文件
vi /opt/kubernetes/server/startup/demo1.mvcone-pod.yaml
apiVersion: v1 kind: Pod metadata: name: demo1-mvcone spec: containers: - name: demo1-mvcone image: 192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1 ports: - containerPort: 50001 imagePullSecrets: - name: myharbor-yyee
imagePullSecrets 節點下的myharbor-yyee名稱就是指定harbor的安全訪問配置名稱。
如果harbor里的鏡像是public類型,則不需要配置imagePullSecrets ,可以直接pull私有harbor中的鏡像。
【創建pod】
kubectl create -f /opt/kubernetes/server/startup/demo1.mvcone-pod.yaml
查看pod
kubectl get pods -o wide
(3) 使用yaml文件創建Deployment
【創建deployment配置文件】
在其中一個【k8s管理節點】上創建Deployment配置文件
vi /opt/kubernetes/server/startup/demo1.mvcone-deploy.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: demo1-mvcone labels: app: demo1-mvcone spec: replicas: 3 selector: matchLabels: app: demo1-mvcone template: metadata: labels: app: demo1-mvcone spec: imagePullSecrets: - name: myharbor-yyee containers: - name: demo1-mvcone image: 192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1 imagePullPolicy: Always ports: - containerPort: 50001
imagePullSecrets 節點下的myharbor-yyee名稱就是指定harbor的安全訪問配置名稱。
如果harbor里的鏡像是public類型,則不需要配置imagePullSecrets ,可以直接pull私有harbor中的鏡像。
【創建Deployment】
kubectl create -f /opt/kubernetes/server/startup/demo1.mvcone-deploy.yaml
查看Deployment
kubectl get deployment -o wide
(4) 使用yaml文件創建DaemonSet
在其中一個【k8s管理節點】上創建Daemonset配置文件
vi /opt/kubernetes/server/startup/demo1.mvcone-daemonset.yaml
apiVersion: apps/v1 kind: DaemonSet metadata: name: demo1-mvcone labels: app: demo1-mvcone spec: selector: matchLabels: app: demo1-mvcone template: metadata: labels: app: demo1-mvcone spec: imagePullSecrets: - name: myharbor-yyee containers: - name: demo1-mvcone image: 192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1 imagePullPolicy: Always ports: - containerPort: 50001
imagePullSecrets 節點下的myharbor-yyee名稱就是指定harbor的安全訪問配置名稱。
如果harbor里的鏡像是public類型,則不需要配置imagePullSecrets ,可以直接pull私有harbor中的鏡像。
【創建DaemonSet】
kubectl create -f /opt/kubernetes/server/startup/demo1.mvcone-daemonset.yaml
查看DaemonSet
kubectl get daemonset -o wide
查看pod
kubectl get pod -o wide
(5) Pod,DaemonSet,Deployment對比
Pod每次只能給一個工作節點創建一個Pod實例。
DaemonSet一次性給每個工作節點創建一個Pod實例,不能擴容,3個工作節點總共創建3個Pod。
Deployment可以創建多個Pod實,不受工作節點限制,將Pod均衡的分配到每個工作節點, Pod實例可以多於也可以小於工作節點的個數,方便擴縮容。