• 二进制部署k8s集群(三):部署kube-apiserver,签发kube-apiserver证书|kuelete证书|kube-proxy证书


    下载 kubernetes 1.18.3 二进制安装包:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183 

    注意:打开链接有很多下载包,包含kubernetes-client 、kubernetes-server 、kubernetes-node,下载第一个64位的tar.gz文件。

    下载 kubernetes-client:https://dl.k8s.io/v1.18.3/kubernetes-client-darwin-amd64.tar.gz

    下载  kubernetes-server:https://dl.k8s.io/v1.18.3/kubernetes-server-linux-amd64.tar.gz

    下载 kubernetes-node:https://dl.k8s.io/v1.18.3/kubernetes-node-linux-amd64.tar.gz

    将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-5

    kubelet,docker,kube_proxy,caliop, CNI 

       

    下载kubernetes-server安装包

    分别在 192.168.0.102 与192.168.0.103两个节点上安装 kube-apiserver 。

    首先下载kubernetes-server 1.183二进制安装包。

    下载完安装包之后,解压到 /opt/kubernetes  目录。

    tar xfv kubernetes-v1.18.3-server-linux-amd64.tar.gz  -C /opt
    cd /opt/
    #将kubernetes重命名为kubernetes-1.18.3
    mv /opt/kubernetes  /opt/kubernetes-1.18.3
    #创建一个软链接,方便升级
    ln -s /opt/kubernetes-1.18.3/ /opt/kubernetes

      /opt/kubernetes 目录里面有个源码包  kubernetes-src.tar.gz ,对部署没用,把它删掉。

        /opt/kubernetes/server/bin 目录下有很多 .tar和_tag 结尾的docker镜像文件,把它删掉。

      

    cd /opt/kubernetes/server/bin
    rm -f *.tar rm -f *_tag
    签发 kube-apiserver证书|client证书|kutelet证书

    《 二进制部署k8s集群(二): 签发etcd证书,安装etcd集群 这一篇中写了如何签发ca根证书以及etcd证书,本篇签发 kube-apiserver 证书需要用到上一篇签发好的私钥证书以及ca根证书配置文件(ca.pem, ca-csr.json, ca-config.json) 。

    上一篇已经签发的证书有:

    (1) 创建证书请求文件:apiserver、client、kubelet、kube-proxy

    【创建apiserver证书请求文件】

    编写证书请求文件.

    vi  /opt/certs/apiserver-csr.json

    {
      "CN": "k8s-apiserver",
      "hosts": [
        "127.0.0.1",
        "192.168.0.1",
        "192.168.0.51",
        "kubernetes", 
        "kubernetes.default", 
        "kubernetes.default.svc", 
        "kubernetes.default.svc.cluster", 
        "kubernetes.default.svc.cluster.local",
        "192.168.0.101",
        "192.168.0.102",
        "192.168.0.103",
        "192.168.0.104",
        "192.168.0.105",
        "192.168.0.106",
        "192.168.0.161"
      ],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "Beijing",
          "L": "Beijing",
          "O": "k8s",
          "OU": "system"
        }
      ]
    }

     注意hosts节点,所有需要访问k8s的有关ip都要写进来,包括本机ip,缩主机ip,宿主机默认网关ip。

      

    【创建client证书请求文件】

    编写客户端证书请求文件,为了少签发一些证书,将 kube-proxy,kube-admin等证书合成一个客户端证书。

    vi  /opt/certs/client-csr.json

    {
      "CN": "k8s-node",
      "hosts": [
    
      ],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "Beijing",
          "L": "Beijing",
          "O": "k8s",
          "OU": "system"
        }
      ]
    }

    【创建 kubelete 证书请求文件】

    vi /opt/certs/kubelet-csr.json

    {
      "CN": "k8s-kubelet",
      "hosts": [
        "127.0.0.1",
        "192.168.0.51",
        "192.168.0.101",
        "192.168.0.102",
        "192.168.0.103",
        "192.168.0.104",
        "192.168.0.105",
        "192.168.0.106"
      ],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "Beijing",
          "L": "Beijing",
          "O": "k8s",
          "OU": "system"
        }
      ]
    }

     hosts要把所有可能用到kebelet上的ip全都写上, 包括windows宿主机ip,宿主机默认网关ip,vmware网关ip 。

    【创建kube-proxy证书请求文件】

    vi /opt/certs/kubelet-csr.json

    {
      "CN": "system:kube-proxy",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "Beijing",
          "L": "Beijing",
          "O": "k8s",
          "OU": "system"
        }
      ]
    }

    指定该证书的 User 为 system:kube-proxy 。

    注意:kube-proxy证书请求文件的CN等于system:kube-proxy,不要改,多个空格都不行。

    (2) 创建kube-apiserver证书、client证书、kubelet证书、kube-proxy证书

     这些证书:apiserver证书,client证书,kubelet证书,kube-proxy-client证书,包括etcd证书,都是基于同一个ca证书ca.pem、同一个ca私钥ca-key.pem、以及同一个证书根配置文件ca-config.json创建。

    #kube-apiserver证书
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client apiserver-csr.json | cfssljson -bare apiserver
    
    #client证书
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client client-csr.json | cfssljson -bare client
    
    #kubelet证书
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client  kubelet-csr.json | cfssljson -bare kubelet
    
    #kube-proxy证书
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client  kube-proxy-csr.json | cfssljson -bare kube-proxy-client

    注意:

    创建kube-apiserver证书的 -profile参数值可以配置成k8s-server ,只用于服务端通讯。

    创建client证书的 -profile参数值可以配置成k8s-client ,只用于客户端通讯。

    创建kubelet证书的 -profile参数值可以配置成k8s-server ,只用于服务端通讯。

    创建kube-proxy证书的 -profile参数值可以配置成k8s-client ,只用于客户端通讯。

    查看创建好的证书:

    ll  /opt/certs/

     

           

    将apiserver-key.pem , apiserver.pem, ca-key.pem,  ca.pem, client-key.pem, client.pem, kubelet-key.pem, kubelet.pem, kube-proxy-client-key.pem,  kube-proxy-client.pem 十个文件拷贝到【管理节点1】与【管理节点2】的  /opt/kubernetes/server/bin/certs/  目录下。

    mkdir /opt/kubernetes/server/bin/cert
    cd /opt/certs
    scp apiserver-key.pem  apiserver.pem  ca-key.pem  ca.pem  client-key.pem  client.pem  kubelet-key.pem  kubelet.pem  kube-proxy-client-key.pem  kube-proxy-client.pem  192.168.0.102:/opt/kubernetes/server/bin/certs/
    scp apiserver-key.pem  apiserver.pem  ca-key.pem  ca.pem  client-key.pem  client.pem  kubelet-key.pem  kubelet.pem  kube-proxy-client-key.pem  kube-proxy-client.pem  192.168.0.103:/opt/kubernetes/server/bin/certs/

    进入k8s服务器的安装目录查看,里面有十个证书文件。

    ll /opt/kubernetes/server/bin/certs

    部署kube-apiserver

    (1) 创建apiserver启动文件

    【管理节点1】的apiserver启动文件

    切换到192.168.0.102

    vi  /opt/kubernetes/server/bin/kube-apiserver.sh

    #!/bin/bash
     ./kube-apiserver 
      --apiserver-count 2 
      --audit-log-path /data/logs/kubernetes/kube-apiserver/audit-log 
      --authorization-mode RBAC 
      --client-ca-file ./certs/ca.pem 
      --requestheader-client-ca-file ./certs/ca.pem 
      --enable-admission-plugins NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota 
      --insecure-bind-address=0.0.0.0 
      --etcd-cafile ./certs/ca.pem 
      --etcd-certfile ./certs/client.pem 
      --etcd-keyfile ./certs/client-key.pem 
      --etcd-servers http://192.168.0.102:2379,http://192.168.0.103:2379,http://192.168.0.104:2379 
      --service-account-key-file ./certs/ca-key.pem 
      --service-cluster-ip-range 10.67.0.0/16 
      --service-node-port-range 20000-60000 
      --target-ram-mb=1024 
      --kubelet-client-certificate ./certs/client.pem 
      --kubelet-client-key ./certs/client-key.pem 
      --log-dir /data/logs/kubernetes/kube-apiserver 
      --tls-cert-file ./certs/apiserver.pem 
      --tls-private-key-file ./certs/apiserver-key.pem 
      --v 2

    --apiserver-count 2 表示有两个apiserver节点

    --etcd-servers参数配置etcd集群地址。

    --service-cluster-ip-range 10.67.0.0/16   集群内部的service虚拟ip 

    【管理节点1】的apiserver启动文件

    切换到192.168.0.102

    vi  /opt/kubernetes/server/bin/kube-apiserver.sh

    #!/bin/bash
     ./kube-apiserver 
      --apiserver-count 2 
      --audit-log-path /data/logs/kubernetes/kube-apiserver/audit-log 
      --authorization-mode RBAC 
      --client-ca-file ./certs/ca.pem 
      --requestheader-client-ca-file ./certs/ca.pem 
      --enable-admission-plugins NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota 
      --insecure-bind-address=0.0.0.0 
      --etcd-cafile ./certs/ca.pem 
      --etcd-certfile ./certs/client.pem 
      --etcd-keyfile ./certs/client-key.pem 
      --etcd-servers http://192.168.0.102:2379,http://192.168.0.103:2379,http://192.168.0.104:2379 
      --service-account-key-file ./certs/ca-key.pem 
      --service-cluster-ip-range 10.67.0.0/16 
      --service-node-port-range 20000-60000 
      --target-ram-mb=1024 
      --kubelet-client-certificate ./certs/client.pem 
      --kubelet-client-key ./certs/client-key.pem 
      --log-dir /data/logs/kubernetes/kube-apiserver 
      --tls-cert-file ./certs/apiserver.pem 
      --tls-private-key-file ./certs/apiserver-key.pem 
      --v 2

    --apiserver-count 2 表示有两个apiserver节点

    --etcd-servers参数配置etcd集群地址。

    --service-cluster-ip-range 10.67.0.0/16   集群内部的service虚拟ip 

    (2) 验证apiserver是否可以启动

    创建工作目录与数据目录

    mkdir -p /data/logs/kubernetes/kube-apiserver/audit-log
    mkdir -p /data/logs/kubernetes/kube-apiserver

    启动kube-apiserver

    chmod +x /opt/kubernetes/server/bin/kube-apiserver.sh
    ./kube-apiserver.sh

    查看启动状态

    netstat -luntp | grep kube-apiserv

    用同样的方式在 【k8s管理节点2】192.168.0.103主机上安装kube-apiserver 。 

    按ctrl+c键退出 kube-apiserver,用其它方式开机自动启动,我们这里用supervisor来启动。

    用supervisor启动kube-apiserver

    supervisor是个python写的进程管理软件,它用子线程的方式启动一个应用程序,当应用程序crash的时候它会重新拉起被管理的程序。

    【安装supervisor】

    yum install supervisor
    systemctl enable supervisord
    systemctl start supervisord

    【编辑kube-apiserver启动配置文件】

    将配置文件放到 /etc/supervisord 目录下,以.ini作为扩展名,文件名可以任意,可以放置多个不同的启动配置文件,每个配置文件以不同的服务启动。

    在【管理节点1】上编辑kube-apiserver启动文件。

    vi  /etc/supervisord.d/kube-apiserver.ini

    [program:kube-apiserver-01]
    command=/opt/kubernetes/server/bin/kube-apiserver.sh
    numprocs=1
    directory=/opt/kubernetes/server/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-apiserver/apiserver.stdout.log
    stdout_logfile_maxbytes=64MB
    stdout_logfile_backups=4
    stdout_capture_maxbytes=1MB
    stdout_events_enabled=false

    在【管理节点2】上编辑kube-apiserver启动文件。

    vi  /etc/supervisord.d/kube-apiserver.ini

    [program:kube-apiserver-02]
    command=/opt/kubernetes/server/bin/kube-apiserver.sh
    numprocs=1
    directory=/opt/kubernetes/server/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-apiserver/apiserver.stdout.log
    stdout_logfile_maxbytes=64MB
    stdout_logfile_backups=4
    stdout_capture_maxbytes=1MB
    stdout_events_enabled=false

    【启动两个管理节点上的kube-apiserver服务】

    #启动新加入到supervisor中的服务
    supervisorctl update
    #查看状态
    supervisorctl status

      

    查看kube-apiserver运行状态

    netstat -luntp | grep kube-apiserv

    查看kube-apiserver启动日志

    tail -fn 200 /data/logs/kubernetes/kube-apiserver/apiserver.stdout.log 

    【supervisor命令说明】

    supervisorctl status                   #查看所有进程的状态
    supervisorctl stop 服务名          #停止服务
    supervisorctl start 服务名          #启动服务
    supervisorctl restart 服务名      #重启服务
    supervisorctl update                 #配置文件修改后使用该命令加载新的配置
    supervisorctl reload                  #重新启动配置中的所有程序

    用nginx将两个节点的kube-apiserver反向代理出来

    在【管理节点1】与【管理节点2】上安装nginx

    yum install -y nginx

    编辑nginx.conf配置文件,在http节点的后面添加反向代理,注意是在http节点的后面添加,跟http是平级节点。

    vi  /etc/nginx/nginx.conf

    stream {
        upstream kube-apiserver {
            server 192.168.0.102:6443    max_fails=3 fail_timeout=30s;
            server 192.168.0.103:6443    max_fails=3 fail_timeout=30s;
        }
        server {
            listen 7443;
            proxy_connect_timeout 2s;
            proxy_timeout 900s;
            proxy_pass kube-apiserver;
        }
    }

    反向代理到本机的7443端口。

       注意,是添加到http节点的后面

     检查nginx配置语言件语法:

    nginx -t

    启动nginx

    systemctl start nginx
    systemctl enable nginx

    这样,通过192,168.0.102:7443或者192.168.0.103:7443其中一台节点就可以访问kube-apiserver了。

    如果要对nginx做可高用,当其中一个节点上的nginx挂了之后,需要立马把nginx拉起来,这时候用keepalived可以做到,那么就要在两个点节上配置keepalived 。

  • 相关阅读:
    java面试题之简单介绍一下集合框架
    java面试题之hashcode相等两个类一定相等吗?equals呢?相反呢?
    java面试题之什么是ThreadLocal?底层如何实现的?
    java面试题之stop()和suspend()方法为何不不推荐使⽤?
    设计模式—单例模式
    Java并发—同步容器和并发容器
    Java并发—并发工具类
    Java并发—原子类,java.util.concurrent.atomic包(转载)
    Java并发—java.util.concurrent.locks包
    Java并发—java.util.concurrent并发包概括(转载)
  • 原文地址:https://www.cnblogs.com/yyee/p/13215572.html
Copyright © 2020-2023  润新知