5. 部署kubernetes组件

部署master组件

kubernetes master 包含的组件:

  • kube-apiserver

  • kube-scheduler

  • kube-controller-manager
    三个组件需要部署在同一节点上。

  • kube-schedulerkube-controller-managerkube-apiserver 三者的功能紧密相关;

  • 同时只能有一个 kube-schedulerkube-controller-manager 进程处于工作状态,如果运行多个,则需要通过选举产生一个 leader,用于此处为单机版,故未使用高可用部署,以单实例启动。

组件的创建步骤如下:

  1. 创建kubernetes证书

  2. pull其相关镜像并编辑Dockerfile文件与参数文件

  3. 启动并运行

后续3个组件的部署将参照如上方式。

kube-apiserver

创建kubernetes证书

创建 kubernetes 证书签名请求

$ cat > kubernetes-csr.json <<EOF
{
  "CN": "kubernetes",
  "hosts": [
    "127.0.0.1",
    "100.69.218.95",
    "10.96.0.1",
    "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 或域名列表,所以上面分别指定了当前部署的 master 主机 IP;

  • 还需要添加 kube-apiserver 注册的名为 kubernetes 的服务 IP (Service Cluster IP),一般是 kube-apiserver --service-cluster-ip-range 选项值指定的网段的第一个IP,如 10.96.0.1
    (后续部署后才能查看)

    $ kubectl get svc kubernetes
    NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes   10.96.0.1   <none>        443/TCP   1d
    

生成 kubernetes 证书和私钥

$ cfssl gencert -ca=/root/cfssldir/ca.pem \
  -ca-key=/root/cfssldir/ca-key.pem \
  -config=/root/cfssldir/ca-config.json \
  -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
$ ls kubernetes*
kubernetes.csr  kubernetes-csr.json  kubernetes-key.pem  kubernetes.pem
$ sudo mkdir -p /root/apiserverdockerfile
$ sudo cp kubernetes*.pem ca.pem ca-key.pem etcd.pem etcd-key.pem /root/apiserverdockerfile

配置和启动 kube-apiserver

创建 kube-apiserver 使用的客户端 token 文件

kubelet 首次启动时向 kube-apiserver 发送 TLS Bootstrapping 请求,kube-apiserver 验证 kubelet 请求中的 token 是否与它配置的 token.csv 一致,如果一致则自动为 kubelet生成证书和秘钥。

 # 在环境变量设置中对该变量有说明,根据产生的token自行创建token.csv文件 
$ cd /root/apiserverdockerfile
[root@k8s01 apiserverdockerfile]# cat token.csv
41f7e4ba8b7be874fcff18bf5cf41a7c,kubelet-bootstrap,10001,"system:kubelet-bootstrap"

创建Dockerfile与docker-entrypoint.sh文件用于创建镜像

$ docker pull harbor.uat.com/kubernetes1.18/kube-apiserver-amd64:v1.11.8 #若从外网环境下拉取镜像可选择gcr.io官方拉取
$ vim docker-entrypoint.sh
#!/bin/sh
 APISERVER_CMD=" kube-apiserver  \
  --enable-swagger-ui=true \
  --enable-admission-plugins=Initializers,NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \
  --experimental-encryption-provider-config=encryption-config.yaml \
  --token-auth-file=token.csv \
  --etcd-cafile=ca.pem \
  --advertise-address=100.69.218.95 \
  --etcd-certfile=kubernetes.pem \
  --etcd-keyfile=kubernetes-key.pem \
  --etcd-servers=https://100.69.218.95:2379 \
  --bind-address=0.0.0.0 \
  --insecure-bind-address=0.0.0.0 \
  --tls-cert-file=kubernetes.pem \
  --tls-private-key-file=kubernetes-key.pem \
  --audit-log-maxage=15 \
  --audit-log-maxbackup=3 \
  --audit-log-maxsize=100 \
  --alsologtostderr=true \
  --audit-log-path=/data/k8s/k8s/kube-apiserver/audit.log \
  --client-ca-file=ca.pem \
  --enable-bootstrap-token-auth \
  --service-account-key-file=ca-key.pem \
  --runtime-config=api/all \
  --allow-privileged=true \
  --apiserver-count=1 \
  --event-ttl=1h \
  --service-cluster-ip-range=10.96.0.0/16 \
  --service-node-port-range=8400-9000  \
  --logtostderr=true \
  --v=2
    "
exec $APISERVER_CMD

  • kube-apiserver 1.6 版本开始使用 etcd v3 API 和存储格式;
  • --authorization-mode=RBAC 指定在安全端口使用 RBAC 授权模式,拒绝未通过授权的请求;
  • kube-scheduler、kube-controller-manager 一般和 kube-apiserver 部署在同一台机器上,它们使用非安全端口和 kube-apiserver通信;
  • kubelet、kube-proxy、kubectl通过安全端口访问 kube-apiserver,则必须先通过 TLS 证书认证,再通过 RBAC 授权;
  • kube-proxy、kubectl 通过在使用的证书里指定相关的 User、Group 来达到通过 RBAC 授权的目的;
  • 如果使用了 kubelet TLS Boostrap 机制,则不能再指定 --kubelet-certificate-authority--kubelet-client-certificate--kubelet-client-key 选项,否则后续 kube-apiserver 校验 kubelet 证书时出现 ”x509: certificate signed by unknown authority“ 错误;
  • --admission-control 值必须包含 ServiceAccount,否则部署集群插件时会失败;
  • --bind-address 不能为 127.0.0.1
  • --service-cluster-ip-range 指定 Service Cluster IP 地址段,该地址段不能路由可达;
  • --service-node-port-range=${NODE_PORT_RANGE} 指定 NodePort 的端口范围;
  • --experimental-encryption-provider-config 参数指定与etcd的加密通信
$ vim Dockerfile
FROM harbor.uat.com/library/kube-apiserver-amd64:v1.11.8
MAINTAINER  linyx002
COPY encryption-config.yaml /
COPY ca.pem /
COPY ca-key.pem /
COPY kubernetes.pem /
COPY kubernetes-key.pem /
COPY etcd.pem /
COPY etcd-key.pem /
COPY token.csv /
RUN  mkdir -p /data/k8s/k8s/kube-apiserver /
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

接下来创建镜像并启动etcd,进行功能验证

$ docker build -t linyx002/kube-apiserver:v1.11.8 . #后面有个点
#看到成功构建信息后执行以下命令
$docker run -d  --net=host --name apiserver0 linyx002/kube-apiserver:1.11.8 #指定网络环境与本机一致
#查看日志
$ docker logs apiserver0
#执行如下命令
$ kubectl get cs
#能看到以下命令时,表示kubectl与apiserver均可用
etcd-0               Healthy   {"health": "true"}


  • --net=host表示绑定将apiserver的网络环境与本机网络相同

kube-controller

#复制相关证书
$ cd /root/cfssldir
$ mkdir -p /root/controllerdockerfile
$ cp ca*.pem /root/controllerdockerfile
cd /root/controllerdockerfile

创建Dockerfile与docker-entrypoint.sh文件用于创建镜像

$ docker pull harbor.uat.com/kubernetes1.18/kube-controller-manager-amd64:v1.11.8 
#若从外网环境下拉取镜像可选择gcr.io官方拉取
$ vim docker-entrypoint.sh
#!/bin/sh
CONTROLLER_CMD=" kube-controller-manager  \
  --address=127.0.0.1 \
  --bind-address=0.0.0.0 \
  --master=http://100.69.218.95:8080 \
  --service-cluster-ip-range=10.96.0.0/16 \
  --cluster-cidr=172.17.0.0/16 \
  --cluster-name=kubernetes \
  --use-service-account-credentials \
  --cluster-signing-cert-file=ca.pem \
  --cluster-signing-key-file=ca-key.pem \
  --root-ca-file=ca.pem \
  --service-account-private-key-file=ca-key.pem \
  --leader-elect=true \
  --allocate-node-cidrs=true \
  --v=2
Restart=on
Restart=on-failure
RestartSec=5
 "
exec $CONTROLLER_CMD


  • --address 值必须为 127.0.0.1,因为当前 kube-apiserver 期望 scheduler controller-manager 在同一台机器
  • --master=http://100.69.218.95:8080:使用非安全 8080 端口与 kube-apiserver 通信;
  • --cluster-cidr 指定 Cluster 中 Pod 的 CIDR 范围,该网段在各 Node 间必须路由可达(flanneld保证);
  • --service-cluster-ip-range 参数指定 Cluster 中 Service 的CIDR范围,该网络在各 Node 间必须路由不可达,必须和 kube-apiserver 中的参数一致;
  • --cluster-signing-* 指定的证书和私钥文件用来签名为 TLS BootStrap 创建的证书和私钥;
  • --root-ca-file 用来对 kube-apiserver 证书进行校验,指定该参数后,才会在Pod 容器的 ServiceAccount 中放置该 CA 证书文件
$ vim Dockerfile
FROM harbor.uat.com/kubernetes1.18/kube-controller-manager-amd64:v1.11.8
MAINTAINER  backtrace
RUN mkdir -p /var/log/kubernetes
COPY  ca.pem  /
COPY  ca-key.pem /
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

接下来创建镜像并启动controller,进行功能验证

$ docker build -t  harbor.uat.com/kubernetes1.18/kube-controller-manager-amd64:v1.11.8 . #后面有个点
#看到成功构建信息后执行以下命令
$docker run -d  --net=host --name  harbor.uat.com/kubernetes1.18/kube-controller-manager-amd64:v1.11.8
#查看日志
$ docker logs controller0
#执行如下命令
$ kubectl get cs
#能看到以下命令时,controller可用
controller-manager   Healthy   ok

kube-scheduler

创建Dockerfile与docker-entrypoint.sh文件用于创建镜像

$ docker pull harbor.uat.com/kubernetes1.18/kube-scheduler-manager-amd64:v1.11.8 
#若从外网环境下拉取镜像可选择gcr.io官方拉取
$ vim docker-entrypoint.sh
#!/bin/sh
S_CMD=" kube-scheduler \
  --address=127.0.0.1 \
  --master=http://100.69.218.95:8080 \
  --leader-elect=true \
  --log-dir=/var/log/kubernetes \
  --v=2
Restart=on-failure
RestartSec=5 "
exec $S_CMD


$ vim Dockerfile
FROM harbor.uat.com/kubernetes/kube-scheduler-amd64:v1.11.8
MAINTAINER  backtrace
RUN mkdir -p /var/log/kubernetes
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

接下来创建镜像并启动scheduler,进行功能验证

$ docker build -t harbor.uat.com/kubernetes/kube-scheduler-amd64:v1.11.8 . #后面有个点
#看到成功构建信息后执行以下命令
$docker run -d  --net=host --name scheduler0 harbor.uat.com/kubernetes/kube-scheduler-amd64:v1.11.8
#查看日志
$ docker logs scheduler0

执行如下命令
$ kubectl get cs
#能看到以下命令时,组件均正常
[root@k8s01 schedulerdockerfile]# kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}
[root@k8s01 schedulerdockerfile]#

posted @ 2021-10-04 16:57  backTraced  阅读(52)  评论(0编辑  收藏  举报