二進制部署k8s集群(6):部署kube-proxy


將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實例可以多於也可以小於工作節點的個數,方便擴縮容。

 


免責聲明!

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



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