部署 Master 节点
部署 Master 节点
kubernetes master 节点包含的组件:
- kube-apiserver
- kube-controller-manager
- kube-scheduler
apiserver
、controller-manager
和 scheduler
三者的功能紧密相关,一般运行在同一个机器上,我们可以把它们当做一个整体来看,所以保证了apiserver的高可用即是保证了三个模块的高可用。也可以同时启动多个controller-manager进程,但只有一个会被选举为leader提供服务。
提示
docker 安装方式请看ubuntu安装docker
1. 从Github下载二进制文件
下载地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183
提示
注:打开链接你会发现里面有很多包,下载一个server包就够了,包含了Master和Worker Node二进制文件。
2. 解压二进制包
# 创建工作目录
mkdir -p /etc/kubernetes/server/{bin,cfg,logs}
# 解压缩
tar zxvf kubernetes-server-linux-amd64.tar.gz
# 移动 二进制文件
cd kubernetes/server/bin
cp kube-apiserver kube-scheduler kube-controller-manager /etc/kubernetes/server/bin
cp kubectl /usr/local/bin/
3. TLS 证书文件
提示
以下pem
证书文件以及 token.csv
我们在 创建 TLS 证书和秘钥 这一步中已经创建过了。
4. 创建 kubectl kubeconfig 文件
# 指定apiserver的地址和证书位置(ip自行修改)
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ca/ca.pem \
--embed-certs=true \
--server=https://192.168.10.102:6443
# 设置客户端认证参数,指定admin证书和秘钥
kubectl config set-credentials admin \
--client-certificate=/etc/kubernetes/ca/admin/admin.pem \
--embed-certs=true \
--client-key=/etc/kubernetes/ca/admin/admin-key.pem
# 关联用户和集群
kubectl config set-context kubernetes \
--cluster=kubernetes --user=admin
# 设置当前上下文
kubectl config use-context kubernetes
# 设置结果就是一个配置文件,可以看看内容
cat ~/.kube/config
一、部署 Api-server 组件
1 简介
kube-apiserver
是Kubernetes最重要的核心组件之一,主要提供以下的功能
- 提供集群管理的REST API接口,包括认证授权(我们现在没有用到)数据校验以及集群状态变更等
- 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)
生产环境为了保证apiserver的高可用一般会部署2+个节点,在上层做一个lb做负载均衡,比如haproxy。由于单节点和多节点在apiserver这一层说来没什么区别,所以我就部署一个节点就足够
2. 创建kube-apiserver的配置文件
# 创建 apiserver 文件
vim /etc/kubernetes/server/cfg/kube-apiserver.conf
# 内容如下
KUBE_APISERVER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/etc/kubernetes/server/logs \
--etcd-servers=https://192.168.10.102:2379 \
--bind-address=192.168.10.102 \
--secure-port=6443 \
--advertise-address=192.168.10.102 \
--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=/etc/kubernetes/ca/server/token.csv \
--service-node-port-range=30000-32767 \
--kubelet-client-certificate=/etc/kubernetes/ca/server/server.pem \
--kubelet-client-key=/etc/kubernetes/ca/server/server-key.pem \
--tls-cert-file=/etc/kubernetes/ca/server/server.pem \
--tls-private-key-file=/etc/kubernetes/ca/server/server-key.pem \
--client-ca-file=/etc/kubernetes/ca/ca.pem \
--service-account-key-file=/etc/kubernetes/ca/ca-key.pem \
--etcd-cafile=/etc/kubernetes/ca/ca.pem \
--etcd-certfile=/etc/kubernetes/ca/server/server.pem \
--etcd-keyfile=/etc/kubernetes/ca/server/server-key.pem \
--audit-log-maxage=30 \
--audit-log-maxbackup=3 \
--audit-log-maxsize=100 \
--audit-log-path=/etc/kubernetes/server/logs/k8s-audit.log"
字段描述:
- --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证书
- --etcd-xxxfile:连接Etcd集群证书
- --audit-log-xxx:审计日志
3. TLS Bootstrapping 机制
token-auth-file 需要的 token 文件请查看 [创建 TLS 证书和秘钥](/passages/2020-08-12-kubernetes-generate-tls.html#10.1 生成token认证文件)
4. 创建 kube-apiserver的service配置文件
# 创建 kube-apiserver.service 文件
vim /lib/systemd/system/kube-apiserver.service
# kube-apiserver.service 内容如下
[Unit]
Description=Kubernetes API Service
Documentation=https://github.com/kubernetes/kubernetes
After=network.target
[Service]
EnvironmentFile=/etc/kubernetes/server/cfg/kube-apiserver.conf
ExecStart=/etc/kubernetes/server/bin/kube-apiserver $KUBE_APISERVER_OPTS
Restart=on-failure
Type=notify
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
5. 启动并设置开机启动
systemctl daemon-reload
systemctl start kube-apiserver
systemctl enable kube-apiserver
# 查看日志是否启动异常
journalctl -f -u kube-apiserver
6. 授权kubelet-bootstrap用户允许请求证书
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap \
--group=kubelet-bootstrap
二、部署 kube-controller-manager 组件
1. 简介
Controller Manager
由kube-controller-manager
和cloud-controller-manager
组成,是Kubernetes的大脑,它通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态。 kube-controller-manager由一系列的控制器组成,像Replication Controller控制副本,Node Controller节点控制,Deployment Controller管理deployment等等 cloud-controller-manager在Kubernetes启用Cloud Provider的时候才需要,用来配合云服务提供商的控制
controller-manager、scheduler和apiserver 三者的功能紧密相关,一般运行在同一个机器上,我们可以把它们当做一个整体来看,所以保证了apiserver的高可用即是保证了三个模块的高可用。也可以同时启动多个controller-manager进程,但只有一个会被选举为
leader
提供服务。
2. 创建kube-controller的配置文件
# 创建kube-controller-manager.conf配置文件
vim /etc/kubernetes/server/cfg/kube-controller-manager.conf
# kube-controller-manager.conf 内容如下:
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/etc/kubernetes/server/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=/etc/kubernetes/ca/ca.pem \
--cluster-signing-key-file=/etc/kubernetes/ca/ca-key.pem \
--root-ca-file=/etc/kubernetes/ca/ca.pem \
--service-account-private-key-file=/etc/kubernetes/ca/ca-key.pem \
--experimental-cluster-signing-duration=87600h0m0s"
字段描述:
- --master:通过本地非安全本地端口8080连接apiserver。
- --leader-elect:当该组件启动多个时,自动选举(HA)
- --cluster-signing-cert-file/--cluster-signing-key-file:自动为kubelet颁发证书的CA,与apiserver保持一致
3. 创建 kube-controller的service配置文件
# 创建kube-controller-manager.service文件
vim /lib/systemd/system/kube-controller-manager.service
# kube-controller-manager.service 内容如下:
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/etc/kubernetes/server/cfg/kube-controller-manager.conf
ExecStart=/etc/kubernetes/server/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
4. 启动并设置开机启动
systemctl daemon-reload
systemctl start kube-controller-manager
systemctl enable kube-controller-manager
# 查看日志是否启动异常
journalctl -f -u kube-controller-manager
三、部署 kube-scheduler 组件
1. 简介
kube-scheduler
负责分配调度Pod到集群内的节点上,它监听kube-apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分配节点。我们前面讲到的kubernetes的各种调度策略就是它实现的。
2. 创建kube-scheduler的配置文件
# 创建kube-scheduler.conf配置文件
vim /etc/kubernetes/server/cfg/kube-scheduler.conf
# kube-scheduler.conf 内容如下:
KUBE_SCHEDULER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/etc/kubernetes/server/logs \
--leader-elect \
--master=127.0.0.1:8080 \
--bind-address=127.0.0.1"
字段描述:
- --master:通过本地非安全本地端口8080连接apiserver。
- --leader-elect:当该组件启动多个时,自动选举(HA)
3. 创建 kube-controller的service配置文件
# 创建kube-scheduler.service文件
vim /lib/systemd/system/kube-scheduler.service
# kube-scheduler.service 内容如下:
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/etc/kubernetes/server/cfg/kube-scheduler.conf
ExecStart=/etc/kubernetes/server/bin/kube-scheduler $KUBE_SCHEDULER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
4. 启动并设置开机启动
systemctl daemon-reload
systemctl start kube-scheduler
systemctl enable kube-scheduler
# 查看日志是否启动异常
journalctl -f -u kube-scheduler
四、查看集群状态
所有组件都已经启动成功,通过kubectl工具查看当前集群组件状态:
kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
如上输出说明Master节点组件运行正常。