6、Kubernetes master部署

6.1、ApiServer自签证书

apiserver通过https方式进行访问,因此需要证书自签,有两种实现方式:

  • (1)添加可信赖的IP列表(此处使用);
  • (2)携带ca证书发送;
6.1.1、自签证书颁发机构(CA)

接着《基于二进制方式搭建K8s集群-ETCD篇》文章,进入/root/TLS/k8s目录。

 cd /root/TLS/k8s
  • 自签CA(生成CA证书和私钥):
【生成CA 配置文件】
#过期时间10年
cat > ca-config.json << EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "expiry": "87600h",
        "usages": [
          "signing",
          "key encipherment",
          "server auth",
          "client auth"
        ]
      }
    }
  }
}
EOF
#expiry:其中expiry是过期时间,可以指定多个;
#signing:表示该证书可以签名其他证书;
#server auth:表示客户端可以用该证书对服务端进行验证;
#client auth:表示服务端可以用该证书对客户端进行验证;
【生成CA证书签名请求】

cat > ca-csr.json << EOF
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "Beijing",
      "ST": "Beijing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
#CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name),浏览器使用该字段验证网站是否合法;
#O:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
  • 生成CA证书和私钥:
 #执行命令:生成的ca-key.pem 和 ca.pem分别为私钥和证书
 cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

在这里插入图片描述

6.1.2、使用自签CA签发Kubernetes master https证书
【创建 kubernetes master node证书申请文件】

cat > server-csr.json << EOF
{
  "CN": "kubernetes",
  "hosts": [
    "10.0.0.1",
    "127.0.0.1",
    "192.168.0.1",
    "192.168.0.2",
    "192.168.0.3",
    "kubernetes",
    "kubernetes.default",
    "kubernetes.default.svc",
    "kubernetes.default.svc.cluster",
    "kubernetes.default.svc.cluster.local"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Beijing",
      "L": "Beijing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

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

  • 生成证书
 #执行命令:生成的server-key.pem 和 server.pem 分别为私钥和证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server

在这里插入图片描述

6.1.3、使用自签CA签发Kubernetes worker https证书
【创建 kubernetes worker node证书签名文件】

cat > kube-proxy-csr.json << EOF
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Beijing",
      "L": "Beijing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
#执行命令:生成的kube-proxy-key.pem 和 kube-proxy.pem 分别为私钥和证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

在这里插入图片描述

6.2.下载文件

6.2.1、从github下载二进制文件

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md
下载:kubernetes-server-linux-amd64.tar.gz 文件,版本为1.18.20,包括了Master和Node二进制文件。

6.2.2、解压二进制压缩包

在这里插入图片描述

6.2.3、文件与目录准备

进入cd /opt/kubernetes 目录新建如下:

 mkdir logs
 mkdir cfg
 mkdir bin
 mkdir ssl
 #将前面自签CA文件拷贝到/opt/kubernetes/ssl
 cp /root/TLS/k8s/*pem ssl/
 #进入kubenetes的bin目录
 cd kubernetes/server/bin
 #将/opt/kubernetes/server/bin目录下要部署的master服务拷贝到/opt/kubernetes/bin
 cp kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/bin
 #将/opt/kubernetes/server/bin 目录下命令行kubectl工具拷贝到/usr/bin
 cp kubectl /usr/bin/

配置完整后,文件分布如下图所示:
在这里插入图片描述

6.3、kube-apiserver配置

进入cd /opt/kubernetes/cfg 目录进行如下配置:

6.3.1、kube-apiserver配置文件生成
#此处etcd和k8s部署相同机器上,192.168.0.1部署k8s-master
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.0.1:2379,https://192.168.0.2:2379,https://192.168.0.3:2379 \\
--bind-address=192.168.0.1 \\
--secure-port=6443 \\
--advertise-address=192.168.0.1 \\
--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-36767 \\
--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 \\
--etcd-cafile=/opt/etcd/ssl/ca.pem \\
--etcd-certfile=/opt/etcd/ssl/server.pem \\
--etcd-keyfile=/opt/etcd/ssl/server-key.pem \\
--audit-log-maxage=30 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-path=/opt/kubernetes/logs/k8s-audit.log"

EOF

# 【启动参数文件】:
#--logtostderr:默认为true,输出到stderr,不输出到日志;
#--v:日志级别;
#--log-dir:日志目录;
#--etcd-servers:ETCD集群地址;
#--bind-address:监听地址,不能为 127.0.0.1;在本地址的6443端口开启https服务,默认值0.0.0.0;
#--secure-port=6443:https安全端口,默认即6443,0表示禁用;
#--advertise-address:集群通告地址,向集群成员通知 apiserver 消息的 IP 地址;
#--allow-privileged:启用权限,设置为true时,kubernetes允许在Pod中运行拥有系统特权的容器应用;
#--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 的端口范围;
#--tls-xxx-file:apiserver访问kubelet客户端证书;
#--etcd-xxx-file:连接Etcd集群证书;
#--audit-log-xx:审计日志
#--enable-swagger-ui:设置为true时,启用swagger-ui网页,可通过apiserver的usl/swagger-ui访问,默认为false;
#--insecure-port=0:禁用不安全的http服务,默认开启,端口8080,设置为0禁用;
#--admission-control:kuberneres集群的准入控制机制,各控制模块以插件的形式依次生效,集群时必须包含ServiceAccount;
# --event-ttl:apiserver中各时间保留时间,默认即1h,通常用于审计与追踪;
6.3.2、创建apiserver配置文件中的token文件
#创建 TLS Bootstrapping Toke
cat > /opt/kubernetes/cfg/token.csv << EOF
d32910e6acc3e48a45a8178d8d6aef1e,kubelet-bootstrap,10001,"system:node-bootstrapper"
EOF
#格式:token、用户名、UID、用户组;
#token也可以自行生成替换(生成方式):head -c 16 /dev/urandom | od -An -t x | tr -d ' '
#注意:此处用户为kubelet-bootstrap,将在后面被使用;
6.3.3、 systemd管理apiserver
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
6.3.4、启动并设置开机启动
systemctl daemon-reload && systemctl start kube-apiserver
systemctl enable kube-apiserver
#查看启动失败日志:journalctl -fu kube-apiserver
#查看启动状态:systemctl status kube-apiserver 或 systemctl status kube-apiserver -l
#查看端口启用状态:ss -antulp | grep :8080
6.3.5、授权kubelet-bootstrap用户允许请求证书
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
  • TLS Bootstraping工作机制
    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 bootstrap工作流程:
    在这里插入图片描述

6.4、kube-controller-manager

6.4.1、 kube-controller-manager配置文件生成
#不需要修改,默认连接本机
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 \\
--master=127.0.0.1:8080 \\
--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 \\
--experimental-cluster-signing-duration=87600h0m0s"

EOF
6.4.2、systemd管理kube-controller-manager
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
6.4.3、启动并设置开机启动
systemctl daemon-reload && systemctl start kube-controller-manager
systemctl enable kube-controller-manager
#查看启动失败日志:journalctl -fu kube-controller-manager
#查看启动状态:systemctl status kube-controller-manager  或 systemctl status kube-controller-manager -l

6.5、kube-scheduler

6.5.1、kube-scheduler配置文件生成
#不需要修改,默认连接本机
cat > /opt/kubernetes/cfg/kube-scheduler.conf << EOF
KUBE_SCHEDULER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--leader-elect \
--master=127.0.0.1:8080 \
--bind-address=127.0.0.1"
EOF
6.5.2、 systemd管理kube-scheduler
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
  • 启动并设置开机启动
systemctl daemon-reload && systemctl start kube-scheduler
systemctl enable kube-scheduler
#查看启动失败日志:journalctl -fu kube-scheduler
#查看启动状态:systemctl status kube-scheduler 或 systemctl status kube-scheduler -l

6.6、检查master健康

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐