使用 Kubeadm 快速部署K8S环境
2020-03-05 by dongnan
目标
- 使用
kubeadm
完成kubernetes
安装配置任务。
环境描述
目标 k8s
集群由一个Master
管理节点、两个Worker
计算节点组成。
主机: AliYun ecs.g6.large 2c/8G
OS: Ubuntu Server 18.04
Docker: docker-ce:18.09.9
Kubernetes: v1.17.x
网络: 使用相同的 VPC 与 安全组
角色:
master:
主机名: host0
IP: 10.0.20.20
worker:
主机名: host1
IP: 10.0.20.21
主机名: host2
IP: 10.0.20.22
准备工作
Docker 容器运行时
配置apt
源
apt -y install apt-transport-https \
ca-certificates curl gnupg-agent \
software-properties-common bash-completion
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -;
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable";
列出仓库中的版本
apt-cache madison docker-ce
当前 kubernetes v1.17
版本支持 docker-ce:18.09.x
apt install docker-ce=5:18.09.9~3-0~ubuntu-bionic \
docker-ce-cli=5:18.09.9~3-0~ubuntu-bionic
配置文件
# 默认情况没有这个文件需要自行创建
cat /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
},
"max-concurrent-downloads": 9,
"max-concurrent-uploads": 9,
"bip": "192.168.255.1/24",
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://registry.cn-hangzhou.aliyuncs.com"
]
}
# log-opts 配置日志文件大小。
# max-concurrent-downloads(uploads) 配置镜像下载\上传并发数。
# bip 配置docker0的网络接口默认IP地址,避免与主机使用的网络冲突。
# registry-mirrors 配置镜像加速地址。
重启Docker守护进程
systemctl restart docker
查看info信息
docker info
配置NFS客户端(可选)
apt update && apt -y install nfs-common
echo "options sunrpc tcp_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
echo "options sunrpc tcp_max_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
关闭 swap
kubernetes 官方文档指明需要关闭swap
。如果不关闭K8s
运行会出现错误。
# 永久关闭swap方式请自行搜索
sudo swapoff -a
配置 kubernetes 源
使用 aliyun
提供的 kubernetes
源。
apt update && apt install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
安装 kubeadm 工具
默认apt
安装为最新的版本,这里指定v1.17
版本。
apt update
apt install kubeadm=1.17.4-00 kubelet=1.17.4-00 kubectl=1.17.4-00
# 默认则是最新版,目前是 kubernetes v1.18.0
# apt update && apt install -y kubelet kubeadm kubectl
配置步骤
配置 Master
设置环境变量
export MASTER_IP=10.0.20.20
export APISERVER_NAME=master.zzx
export POD_SUBNET=172.18.0.0/16
export SERVICE_SUBNET=172.19.0.0/16
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
注意
APISERVER_NAME
不能是master
的hostname
APISERVER_NAME
必须全为小写字母、数字、小数点,不能包含减号POD_SUBNET \SERVICE_SUBNET
所使用的网段不能与master
/worker
节点所在的网段重叠。
创建 kubeadm-config
cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.17.4
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
serviceSubnet: "${SERVICE_SUBNET}"
podSubnet: "${POD_SUBNET}"
dnsDomain: "zzx"
EOF
注意,dnsDomain
默认为 local
可以根据需求修改。
初始化 master
下载镜像可能需要等候3-10
分钟左右。
kubeadm init --config=kubeadm-config.yaml --upload-certs
# 忽略信息
#W0428 17:39:44.798886 xx Cannot validate kube-proxy config - no validator is available
#W0428 17:39:44.798914 xx Cannot validate kubelet config - no validator is available
配置 kubectl
按照提示配置.kube
目录保存相配置信息,这样不用每次都输入相关的认证信息。
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
配置 Calico 网络插件
# yaml文件
wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
# calico 镜像保存在 Docker Hub,可能遇到下载失败需耐心等待。
kubectl apply -f calico-3.13.1.yaml
注意,可能会遇到 coredns
长时间 pending
状态,确保cni
网络插件容器已经运行。
检查系统 Pod 状态
直到所有的容器组处于 Running
状态
kubectl get pod -n kube-system
calico-kube-controllers-788d6b9876-f87mr 1/1 Running 0 66m
calico-node-5lqmz 1/1 Running 0 66m
coredns-7f9c544f75-sx9s4 1/1 Running 0 73m
coredns-7f9c544f75-vs84q 1/1 Running 0 73m
etcd-khost0 1/1 Running 0 73m
kube-apiserver-khost0 1/1 Running 0 73m
kube-controller-manager-khost0 1/1 Running 0 73m
kube-proxy-6spzf 1/1 Running 0 73m
kube-scheduler-khost0 1/1 Running 0 73m
查看 Master 状态
kubectl get nodes
NAME STATUS ROLES AGE VERSION
host0 Ready master 8m52s v1.17.4
注意: 状态为 Ready
表示 master 初始化完毕。
配置 Worker
获得加入集群的命令参数
在 Master
上执行,用于获取kubeadm join
命令及参数。
kubeadm token create --print-join-command
返回类似如下的命令,这些命令将稍后在 worker
节点使用。
kubeadm join master.zzx:6443 \
--token 60863m.wupvlnezupvz7ale \
--discovery-token-ca-cert-hash \
sha256:622f193d#省略x1a68d
添加 Worker 节点
在 Worker
节点依次执行
export MASTER_IP=10.0.20.20
export APISERVER_NAME=master.zzx
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
kubeadm join master.zzx:6443 \
--token 60863m.wupvlnezupvz7ale \
--discovery-token-ca-cert-hash \
sha256:622f193d#...省略x1a68d
检查 Worker 状态
# 在 master 上执行
kubectl get nodes
NAME STATUS ROLES AGE VERSION
host0 Ready master 38m v1.17.4
host1 NotReady <none> 29s v1.17.4
注意: worker
节点会下载镜像请耐心等待,状态为 Ready
表示 Worker 初始化完毕。
验证
Yaml 文档
创建一个 Deployment
,下面是准备好的 yaml
文档。
cat ngx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
env:
- name: logtail
value: 'true'
创建 Deployment
在 Master
节点执行
kubectl apply -f ngx-deploy.yaml
deployment.apps/nginx-deployment created
检查 Pod 状态
通过 deployment
创建 pod
成功。
kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-59d958898f-4fwdx 1/1 Running 0 110s
nginx-deployment-59d958898f-7nfr2 1/1 Running 0 110s
扩展-重置 kubernetes (可选)
如果觉得 kubernetes
配置过程复杂,希望加强记忆多做几次安装配置工作,可以移除 worker
节点、重新初始化 master
节点,然后重新开始。
首先在 Master
上移除 Worker
节点
# 在 master 节点依次删除节点命令
kubectl delete node demo02
然后依次在 Master
和 Worker
节点执行重置命令
kubeadm reset