二进制部署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实例可以多于也可以小于工作节点的个数,方便扩缩容。