• 二进制部署k8s集群(六):部署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

    解决办法:给匿名用户授予集群管理权限

    在【k8s管理节点】上执行:

    kubectl create clusterrolebinding anonymous-cluster-admin --clusterrole=cluster-admin --user=system:anonymous

    anonymous-cluster-admin是角色绑定名称,随意取名。

    重新启动kube-proxy 。

    为了保证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实例可以多于也可以小于工作节点的个数,方便扩缩容。

  • 相关阅读:
    CF1552 D. Array Differentiation
    CF1542 B. Plus and Multiply
    CF1543 D1. RPD and Rap Sheet (Easy Version)
    CF1555 E. Boring Segments(线段树+双指针)
    CF1513 D. GCD and MST
    hdu 6194 string string string
    CF1527 B2. Palindrome Game (hard version)
    DDD领域驱动设计落地实践(十分钟看完,半小时落地)
    【5分钟】W10 64bit系统本地安装postgresql 11
    程序员如何成为架构师
  • 原文地址:https://www.cnblogs.com/yyee/p/13236530.html
Copyright © 2020-2023  润新知