美文网首页
搭建k8s集群(二进制方式)

搭建k8s集群(二进制方式)

作者: Shaw_Young | 来源:发表于2021-06-27 22:56 被阅读0次

    1、安装要求

    在开始之前,部署kubernetes集群机器需要满足以下几个条件:
    (1)一台或多台机器,操作系统Centos 7.x
    (2)硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30G或更多
    (3)集群中所有机器之间网络互通
    (4)可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
    (5)禁止swap分区

    服务器规划:

    角色 IP 组件
    k8s-master 192.168.126.6 kube-apiserver,kube-controller-manager,kube-scheduler,etcd
    k8s-node1 192.168.126.7 kubelet,kube-proxy,docker etcd
    k8s-node2 192.168.126.8 kubelet,kube-proxy,docker etcd

    2、操作系统初始化

    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    # 关闭 selinux
    sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
    setenforce 0 # 临时
    # 关闭 swap
    swapoff -a # 临时
    sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
    # 根据规划设置主机名
    hostnamectl set-hostname <hostname>
    # 在 master 添加 hosts
    cat >> /etc/hosts << EOF
    192.168.126.6 m1
    192.168.126.7 n1
    192.168.126.8 n2
    EOF
    # 将桥接的 IPv4 流量传递到 iptables 的链
    cat > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    sysctl --system # 生效
    # 时间同步
    yum install ntpdate -y
    ntpdate time.windows.com
    

    3、为etcd和apiserver自签证书

    3.1、准备cfssl证书生成工具
    cfssl 是一个开源的证书管理工具,使用 json 文件生成证书,相比 openssl 更方便使用。
    找任意一台服务器操作,这里用 Master 节点。

    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
    chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
    mv cfssl_linux-amd64 /usr/local/bin/cfssl
    mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
    mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
    

    3.2、生成Etcd证书

    (1)自签证书颁发机构(CA)
    创建工作目录:

    mkdir -p ~/TLS/{etcd,k8s}
    cd TLS/etcd
    

    自签CA:

    cat > ca-config.json<< EOF
    {
    "signing": {
    "default": {
    "expiry": "87600h"
    },
    "profiles": {
    "www": {
    "expiry": "87600h",
    "usages": [
    "signing","key encipherment",
    "server auth",
    "client auth"
    ]
    }
    }
    }
    }
    EOF
    cat > ca-csr.json<< EOF
    {
    "CN": "etcd CA",
    "key": {
    "algo": "rsa",
    "size": 2048
    },
    "names": [
    {
    "C": "CN",
    "L": "Beijing",
    "ST": "Beijing"
    }
    ]
    }
    EOF
    

    生成证书:

    $ cfssl gencert -initca ca-csr.json | cfssljson -bare ca 
    $ ls *pem
    $ ca-key.pem ca.pem
    

    (2)使用自签 CA 签发 Etcd HTTPS 证书
    创建证书申请文件:

    cat > server-csr.json<< EOF
    {
    "CN": "etcd",
    "hosts": [
    "192.168.126.6",
    "192.168.126.7",
    "192.168.126.8"
    ],
    "key": {
    "algo": "rsa",
    "size": 2048
    },
    "names": [
    {
    "C": "CN",
    "L": "BeiJing",
    "ST": "BeiJing"
    }
    ]
    }
    EOF
    

    注:上述文件 hosts 字段中 IP 为所有 etcd 节点的集群内部通信 IP,一个都不能少!为了
    方便后期扩容可以多写几个预留的 IP

    生成证书

    $ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
    $ ls server*pem
    $ server-key.pem server.pe
    

    4、部署etcd集群

    Etcd 是一个分布式键值存储系统,Kubernetes 使用 Etcd 进行数据存储,所以先准备
    一个 Etcd 数据库,为解决 Etcd 单点故障,应采用集群方式部署,这里使用 3 台组建集
    群,可容忍 1 台机器故障,当然,你也可以使用 5 台组建集群,可容忍

    节点名称 IP
    etcd-1 192.168.126.6
    etcd-2 192.168.126.7
    etcd-3 192.168.126.8

    4.1、从 Github 下载二进制文件
    下载地址:https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
    4.2、部署 Etcd 集群
    以下在节点 1 上操作,为简化操作,待会将节点 1 生成的所有文件拷贝到节点 2 和节点 3
    (1)创建工作目录并解压二进制包

    mkdir -p /opt/etcd/{bin,cfg,ssl}
    tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
    mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin
    

    (2)创建 etcd配置文件(将下面的IP设置成自己的IP

    cat > /opt/etcd/cfg/etcd.conf << EOF
    #[Member]
    ETCD_NAME="etcd-1"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.126.6:2380"
    ETCD_LISTEN_CLIENT_URLS="https://192.168.126.6:2379"
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.126.6:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.126.6:2379"
    ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.126.6:2380,etcd-2=https://192.168.126.7:2380,etcd-3=https://192.168.126.8:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    EOF
    

    ETCD_NAME:节点名称,集群中唯一
    ETCD_DATA_DIR:数据目录
    ETCD_LISTEN_PEER_URLS:集群通信监听地址
    ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址
    ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址
    ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址
    ETCD_INITIAL_CLUSTER:集群节点地址
    ETCD_INITIAL_CLUSTER_TOKEN:集群 Token
    ETCD_INITIAL_CLUSTER_STATE:加入集群的当前状态,new 是新集群,existing 表示加入已有集群

    (3)systemd 管理 etc

    cat > /usr/lib/systemd/system/etcd.service << EOF
    [Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target
    [Service]
    Type=notify
    EnvironmentFile=/opt/etcd/cfg/etcd.conf
    ExecStart=/opt/etcd/bin/etcd \
    --cert-file=/opt/etcd/ssl/server.pem \
    --key-file=/opt/etcd/ssl/server-key.pem \
    --peer-cert-file=/opt/etcd/ssl/server.pem \
    --peer-key-file=/opt/etcd/ssl/server-key.pem \
    --trusted-ca-file=/opt/etcd/ssl/ca.pem \
    --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
    --logger=zap
    Restart=on-failure
    LimitNOFILE=65536
    [Install]
    WantedBy=multi-user.target
    EOF
    

    (4)拷贝刚才生成的证书
    把刚才生成的证书拷贝到配置文件中的路径:

    cp ~/TLS/etcd/ca*pem ~/TLS/etcd/server*pem /opt/etcd/ssl/
    

    (5)启动并设置开机启动

    systemctl daemon-reload
    systemctl start etcd
    systemctl enable etcd
    

    (6)将上面节点 1 所有生成的文件拷贝到节点 2 和节点 3

    scp -r /opt/etcd/ root@192.168.126.7:/opt/
    scp /usr/lib/systemd/system/etcd.service root@192.168.126.7:/usr/lib/systemd/system/
    scp -r /opt/etcd/ root@192.168.126.8:/opt/
    scp /usr/lib/systemd/system/etcd.service root@192.168.126.8:/usr/lib/systemd/system/
    

    然后在节点 2 和节点 3 分别修改 etcd.conf 配置文件中的节点名称和当前服务器 IP:

    vi /opt/etcd/cfg/etcd.conf
    #[Member]
    ETCD_NAME="etcd-1" # 修改此处,节点 2 改为 etcd-2,节点 3 改为 etcd-3ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.31.71:2380" # 修改此处为当前服务器 IP
    ETCD_LISTEN_CLIENT_URLS="https://192.168.31.71:2379" # 修改此处为当前服务器 IP
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.71:2380" # 修改此处为当前
    服务器 IP
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.71:2379" # 修改此处为当前服务器
    IP
    ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.71:2380,etcd-2=https://192.168.31.72:2380,etcd-3=https://192.168.31.73:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    

    最后启动 etcd 并设置开机启动,同上
    (7)查看集群状态

    [root@m1 cfg]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.126.6:2379,https://192.168.126.7:2379,https://192.168.126.8:2379" endpoint health --write-out=table
    +----------------------------+--------+-------------+-------+
    |          ENDPOINT          | HEALTH |    TOOK     | ERROR |
    +----------------------------+--------+-------------+-------+
    | https://192.168.126.6:2379 |   true | 13.000265ms |       |
    | https://192.168.126.7:2379 |   true | 13.372518ms |       |
    | https://192.168.126.8:2379 |   true | 12.893033ms |       |
    +----------------------------+--------+-------------+-------+
    

    如果输出上面信息,就说明集群部署成功。如果有问题第一步先看日志:
    /var/log/message 或 journalctl -u etcd

    5、安装docker

    下载地址:https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
    以下在所有节点操作。这里采用二进制安装,用yum安装也一样。
    5.1、解压二进制包

    tar zxvf docker-19.03.9.tgz
    mv docker/* /usr/bin
    

    5.2、systemd管理docker

    cat > /usr/lib/systemd/system/docker.service << EOF
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network-online.target firewalld.service
    Wants=network-online.target
    
    [Service]
    Type=notify
    ExecStart=/usr/bin/dockerd
    ExecReload=/bin/kill -s HUP $MAINPID
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    TimeoutStartSec=0
    Delegate=yes
    KillMode=process
    Restart=on-failure
    StartLimitBurst=3
    StartLimitInterval=60s
    
    [Install]
    WantedBy=multi-user.target
    EOF
    

    5.3、创建配置文件

    mkdir /etc/docker
    cat > /etc/docker/daemon.json << EOF
    {
      "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
    }
    EOF
    
    • registry-mirrors 阿里云镜像加速器
      5.4、启动并设置开机启动
    systemctl daemon-reload
    systemctl start docker
    systemctl enable docker
    

    6、部署master组件

    6.1、生成kube-apiserver证书
    (1)自签证书颁发机构(CA)

    cd ~/TLS/k8s
    cat > ca-config.json << EOF
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "kubernetes": {
             "expiry": "87600h",
             "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ]
          }
        }
      }
    }
    EOF
    cat > ca-csr.json << EOF
    {
        "CN": "kubernetes",
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "Beijing",
                "ST": "Beijing",
                "O": "k8s",
                "OU": "System"
            }
        ]
    }
    EOF
    

    (2)生成证书

    [root@m1 k8s]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    2021/06/30 02:37:02 [INFO] generating a new CA key and certificate from CSR
    2021/06/30 02:37:02 [INFO] generate received request
    2021/06/30 02:37:02 [INFO] received CSR
    2021/06/30 02:37:02 [INFO] generating key: rsa-2048
    2021/06/30 02:37:03 [INFO] encoded CSR
    2021/06/30 02:37:03 [INFO] signed certificate with serial number 83651061574739871943508816364593446909545017239
    

    会生成ca.pem和ca-key.pem文件。
    (3)使用自签CA签发kube-apiserver HTTPS证书
    创建证书申请文件:

    [root@m1 ~]# cd ~/TLS/k8s
    cat > server-csr.json << EOF
    {
        "CN": "kubernetes",
        "hosts": [
          "10.0.0.1",
          "127.0.0.1",
          "192.168.126.6",
          "192.168.126.7",
          "192.168.126.8",
          "192.168.126.9",
          "kubernetes",
          "kubernetes.default",
          "kubernetes.default.svc",
          "kubernetes.default.svc.cluster",
          "kubernetes.default.svc.cluster.local"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "BeiJing",
                "ST": "BeiJing",
                "O": "k8s",
                "OU": "System"
            }
        ]
    }
    EOF
    

    注:上述文件hosts字段中IP为所有Master/LB/VIP IP,一个都不能少!为了方便后期扩容可以多写几个预留的IP。

    生成证书:

    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
    

    会生成server.pem和server-key.pem文件。

    6.2、从Github下载二进制文件
    下载地址:

    https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md
    

    注:打开链接你会发现里面有很多包,下载一个 server 包就够了,包含了 Master 和 Worker Node 二进制文件。

    6.3、解压二进制包

    [root@m1 ~]# mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
    [root@m1 ~]# tar zxvf kubernetes-server-linux-amd64.tar.gz
    [root@m1 ~]# cd kubernetes/server/bin
    [root@m1 bin]# cp kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/bin/
    [root@m1 bin]# cp kubectl /usr/bin/
    

    6.4、部署kube-apiserver
    (1)创建配置文件

    cat > /opt/kubernetes/cfg/kube-apiserver.conf << EOF
    KUBE_APISERVER_OPTS="--logtostderr=false \\
    --v=2 \\
    --log-dir=/opt/kubernetes/logs \\
    --etcd-servers=https://192.168.126.6:2379,https://192.168.126.7:2379,https://192.168.126.8:2379 \\
    --bind-address=192.168.126.6 \\
    --secure-port=6443 \\
    --advertise-address=192.168.126.6 \\
    --allow-privileged=true \\
    --service-cluster-ip-range=10.0.0.0/24 \\
    --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\
    --authorization-mode=RBAC,Node \\
    --enable-bootstrap-token-auth=true \\
    --token-auth-file=/opt/kubernetes/cfg/token.csv \\
    --service-node-port-range=30000-32767 \\
    --kubelet-client-certificate=/opt/kubernetes/ssl/server.pem \\
    --kubelet-client-key=/opt/kubernetes/ssl/server-key.pem \\
    --tls-cert-file=/opt/kubernetes/ssl/server.pem  \\
    --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \\
    --client-ca-file=/opt/kubernetes/ssl/ca.pem \\
    --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
    --service-account-issuer=api \\
    --service-account-signing-key-file=/opt/kubernetes/ssl/server-key.pem \\
    --etcd-cafile=/opt/etcd/ssl/ca.pem \\
    --etcd-certfile=/opt/etcd/ssl/server.pem \\
    --etcd-keyfile=/opt/etcd/ssl/server-key.pem \\
    --requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \\
    --proxy-client-cert-file=/opt/kubernetes/ssl/server.pem \\
    --proxy-client-key-file=/opt/kubernetes/ssl/server-key.pem \\
    --requestheader-allowed-names=kubernetes \\
    --requestheader-extra-headers-prefix=X-Remote-Extra- \\
    --requestheader-group-headers=X-Remote-Group \\
    --requestheader-username-headers=X-Remote-User \\
    --enable-aggregator-routing=true \\
    --audit-log-maxage=30 \\
    --audit-log-maxbackup=3 \\
    --audit-log-maxsize=100 \\
    --audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
    EOF
    

    注:上面两个\ \ 第一个是转义符,第二个是换行符,使用转义符是为了使用EOF 保留换行符。

    • --logtostderr:启用日志
    • ---v:日志等级
    • --log-dir:日志目录
    • --etcd-servers:etcd集群地址
    • --bind-address:监听地址
    • --secure-port:https安全端口
    • --advertise-address:集群通告地址
    • --allow-privileged:启用授权
    • --service-cluster-ip-range:Service虚拟IP地址段
    • --enable-admission-plugins:准入控制模块
    • --authorization-mode:认证授权,启用RBAC授权和节点自管理
    • --enable-bootstrap-token-auth:启用TLS bootstrap机制
    • --token-auth-file:bootstrap token文件
    • --service-node-port-range:Service nodeport类型默认分配端口范围
    • --kubelet-client-xxx:apiserver访问kubelet客户端证书
    • --tls-xxx-file:apiserver https证书
    • 1.20版本必须加的参数:--service-account-issuer,--service-account-signing-key-file
    • --etcd-xxxfile:连接Etcd集群证书
    • --audit-log-xxx:审计日志
    • 启动聚合层相关配置:--requestheader-client-ca-file,--proxy-client-cert-file,--proxy-client-key-file,--requestheader-allowed-names,--requestheader-extra-headers-prefix,--requestheader-group-headers,--requestheader-username-headers,--enable-aggregator-routing

    (2)拷贝刚才生成的证书
    把刚才生成的证书拷贝到配置文件中的路径:

    [root@m1 ~]# cp ~/TLS/k8s/ca*pem ~/TLS/k8s/server*pem /opt/kubernetes/ssl/
    

    (3)启用 TLS Bootstrapping 机制

    TLS Bootstraping:Master apiserver 启用 TLS 认证后,Node 节点 kubelet 和 kube- proxy 要与 kube-apiserver 进行通信,必须使用 CA 签发的有效证书才可以,当 Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。为了简化流程,Kubernetes 引入了 TLS bootstraping 机制来自动颁发客户端证书,kubelet会以一个低权限用户自动向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署。所以强烈建议在 Node 上使用这种方式,目前主要用于 kubelet,kube-proxy 还是由我们统一颁发一个证书。

    TLS bootstraping 工作流程:


    创建上述配置文件中 token 文件:

    cat > /opt/kubernetes/cfg/token.csv << EOF
    c47ffb939f5ca36231d9e3121a252940,kubelet-bootstrap,10001,"system:node-bootstrapper"
    EOF
    

    格式:token,用户名,UID,用户组
    token 也可自行生成替换:

    head -c 16 /dev/urandom | od -An -t x | tr -d ' '
    

    (4)systemd 管理 apiserve

    cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
    [Unit]
    Description=Kubernetes API Server
    Documentation=https://github.com/kubernetes/kubernetes
    
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf
    ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    EOF
    

    (5)并设置开机启动

    systemctl daemon-reload
    systemctl start kube-apiserver
    systemctl enable kube-apiserver
    

    6.5、部署 kube-controller-manage
    (1)创建配置文件

    cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF
    KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\
    --v=2 \\
    --log-dir=/opt/kubernetes/logs \\
    --leader-elect=true \\
    --kubeconfig=/opt/kubernetes/cfg/kube-controller-manager.kubeconfig \\
    --bind-address=127.0.0.1 \\
    --allocate-node-cidrs=true \\
    --cluster-cidr=10.244.0.0/16 \\
    --service-cluster-ip-range=10.0.0.0/24 \\
    --cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\
    --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem  \\
    --root-ca-file=/opt/kubernetes/ssl/ca.pem \\
    --service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\
    --cluster-signing-duration=87600h0m0s"
    EOF
    

    • --kubeconfig:连接apiserver配置文件
    • --leader-elect:当该组件启动多个时,自动选举(HA)
    • --cluster-signing-cert-file/--cluster-signing-key-file:自动为kubelet颁发证书的CA,与apiserver保持一致

    (2)生成kubeconfig文件
    生成kube-controller-manager证书:

    # 切换工作目录
    cd ~/TLS/k8s
    
    # 创建证书请求文件
    cat > kube-controller-manager-csr.json << EOF
    {
      "CN": "system:kube-controller-manager",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "BeiJing", 
          "ST": "BeiJing",
          "O": "system:masters",
          "OU": "System"
        }
      ]
    }
    EOF
    
    # 生成证书
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
    

    生成kubeconfig文件(以下是shell命令,直接在终端执行):

    KUBE_CONFIG="/opt/kubernetes/cfg/kube-controller-manager.kubeconfig"
    KUBE_APISERVER="https://192.168.126.6:6443"
    
    kubectl config set-cluster kubernetes \
      --certificate-authority=/opt/kubernetes/ssl/ca.pem \
      --embed-certs=true \
      --server=${KUBE_APISERVER} \
      --kubeconfig=${KUBE_CONFIG}
    kubectl config set-credentials kube-controller-manager \
      --client-certificate=./kube-controller-manager.pem \
      --client-key=./kube-controller-manager-key.pem \
      --embed-certs=true \
      --kubeconfig=${KUBE_CONFIG}
    kubectl config set-context default \
      --cluster=kubernetes \
      --user=kube-controller-manager \
      --kubeconfig=${KUBE_CONFIG}
    kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
    

    (3)systemd 管理 controller-manage

    cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
    [Unit]
    Description=Kubernetes Controller Manager
    Documentation=https://github.com/kubernetes/kubernetes
    
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kube-controller-manager.conf
    ExecStart=/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    EOF
    

    (4)启动并设置开机启动

    systemctl daemon-reload
    systemctl start kube-controller-manager
    systemctl enable kube-controller-manager
    

    6.6、部署 kube-scheduler
    (1)创建配置文件

    cat > /opt/kubernetes/cfg/kube-scheduler.conf << EOF
    KUBE_SCHEDULER_OPTS="--logtostderr=false \\
    --v=2 \\
    --log-dir=/opt/kubernetes/logs \\
    --leader-elect \\
    --kubeconfig=/opt/kubernetes/cfg/kube-scheduler.kubeconfig \\
    --bind-address=127.0.0.1"
    EOF
    

    • --kubeconfig:连接apiserver配置文件
    • --leader-elect:当该组件启动多个时,自动选举(HA)

    (2)生成kubeconfig文件
    生成kube-scheduler证书:

    # 切换工作目录
    cd ~/TLS/k8s
    
    # 创建证书请求文件
    cat > kube-scheduler-csr.json << EOF
    {
      "CN": "system:kube-scheduler",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "BeiJing",
          "ST": "BeiJing",
          "O": "system:masters",
          "OU": "System"
        }
      ]
    }
    EOF
    
    # 生成证书
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler
    

    生成kubeconfig文件(以下是shell命令,直接在终端执行):

    KUBE_CONFIG="/opt/kubernetes/cfg/kube-scheduler.kubeconfig"
    KUBE_APISERVER="https://192.168.126.6:6443"
    
    kubectl config set-cluster kubernetes \
      --certificate-authority=/opt/kubernetes/ssl/ca.pem \
      --embed-certs=true \
      --server=${KUBE_APISERVER} \
      --kubeconfig=${KUBE_CONFIG}
    kubectl config set-credentials kube-scheduler \
      --client-certificate=./kube-scheduler.pem \
      --client-key=./kube-scheduler-key.pem \
      --embed-certs=true \
      --kubeconfig=${KUBE_CONFIG}
    kubectl config set-context default \
      --cluster=kubernetes \
      --user=kube-scheduler \
      --kubeconfig=${KUBE_CONFIG}
    kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
    

    (3)systemd 管理 schedule

    cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
    [Unit]
    Description=Kubernetes Scheduler
    Documentation=https://github.com/kubernetes/kubernetes
    
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kube-scheduler.conf
    ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    EOF
    

    (4)启动并设置开机启动

    systemctl daemon-reload
    systemctl start kube-scheduler
    systemctl enable kube-schedule
    

    (5)查看集群状态
    生成kubectl连接集群的证书:

    # 切换工作目录
    cd ~/TLS/k8s
    
    cat > admin-csr.json <<EOF
    {
      "CN": "admin",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "BeiJing",
          "ST": "BeiJing",
          "O": "system:masters",
          "OU": "System"
        }
      ]
    }
    EOF
    
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
    

    生成kubeconfig文件:

    mkdir /root/.kube
    
    KUBE_CONFIG="/root/.kube/config"
    KUBE_APISERVER="https://192.168.126.6:6443"
    
    kubectl config set-cluster kubernetes \
      --certificate-authority=/opt/kubernetes/ssl/ca.pem \
      --embed-certs=true \
      --server=${KUBE_APISERVER} \
      --kubeconfig=${KUBE_CONFIG}
    kubectl config set-credentials cluster-admin \
      --client-certificate=./admin.pem \
      --client-key=./admin-key.pem \
      --embed-certs=true \
      --kubeconfig=${KUBE_CONFIG}
    kubectl config set-context default \
      --cluster=kubernetes \
      --user=cluster-admin \
      --kubeconfig=${KUBE_CONFIG}
    kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
    

    通过kubectl工具查看当前集群组件状态:

    [root@m1 k8s]# kubectl get cs
    Warning: v1 ComponentStatus is deprecated in v1.19+
    NAME                 STATUS    MESSAGE             ERROR
    controller-manager   Healthy   ok                  
    etcd-0               Healthy   {"health":"true"}   
    etcd-2               Healthy   {"health":"true"}   
    etcd-1               Healthy   {"health":"true"}   
    scheduler            Healthy   ok  
    

    6.7、授权kubelet-bootstrap用户允许请求证书

    kubectl create clusterrolebinding kubelet-bootstrap \
    --clusterrole=system:node-bootstrapper \
    --user=kubelet-bootstrap
    

    7、部署node组件

    8、部署集群网络

    相关文章

      网友评论

          本文标题:搭建k8s集群(二进制方式)

          本文链接:https://www.haomeiwen.com/subject/oxswyltx.html