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

 

posted @ 2020-07-04 20:44  民工黑猫  阅读(1771)  评论(0编辑  收藏  举报