跳至主要內容

部署 Master 节点

Zenghr大约 6 分钟kubernetes

部署 Master 节点

kubernetes master 节点包含的组件:

  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler

apiservercontroller-managerscheduler 三者的功能紧密相关,一般运行在同一个机器上,我们可以把它们当做一个整体来看,所以保证了apiserver的高可用即是保证了三个模块的高可用。也可以同时启动多个controller-manager进程,但只有一个会被选举为leader提供服务。

提示

docker 安装方式请看ubuntu安装docker

1. 从Github下载二进制文件

下载地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183open in new window

提示

注:打开链接你会发现里面有很多包,下载一个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 Managerkube-controller-managercloud-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节点组件运行正常。