脚本宝典收集整理的这篇文章主要介绍了5. 部署kubernetes组件,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
kubernetes master 包含的组件:
kube-apiserver
kube-scheduler
kube-controller-manager 三个组件需要部署在同一节点上。
kube-scheduler
、kube-controller-manager
和 kube-apiserver
三者的功能紧密相关;
同时只能有一个 kube-scheduler
、kube-controller-manager
进程处于工作状态,如果运行多个,则需要通过选举产生一个 leader,用于此处为单机版,故未使用高可用部署,以单实例启动。
组件的创建步骤如下:
创建kubernetes证书
pull其相关镜像并编辑dockerfile文件与参数文件
启动并运行
后续3个组件的部署将参照如上方式。
创建 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
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
--authorization-mode=RBAC
指定在安全端口使用 RBAC 授权模式,拒绝未通过授权的请求;--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的网络环境与本机网络相同#复制相关证书
$ 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
创建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]#
以上是脚本宝典为你收集整理的5. 部署kubernetes组件全部内容,希望文章能够帮你解决5. 部署kubernetes组件所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。