Kubernetes、kubeSphere 部署说明
官网的版本更新迭代速度很快,网上的部署资料参差不齐。能够完整跑起来的可谓凤毛麟角。基于此做个备忘。
基础服务器列表
从零开始,在干净的机器上安装 Docker、Kubernetes (使用 kubeadm)、Calico、Helm、NFS StorageClass,通过此备忘搭建一个学习环境的 Kubernetes集群,并在 Kubernetes 集群之上安装开源的 KubeSphere 容器平台可视化运营集群环境。
- 为了部署一套能够正常使用的K8s环境。我将k8s的1.17.x、1.18.x、1.20.x版本都部署了一遍。后来发现kubeSphere最新版本不支持K8s的1.20.x。
一、环境准备:
- 三台及以上主机
- 每台主机的主机名、Mac 地址、UUID 不相同
- CentOS 7.x(本文用 7.6)
- 每台机器最好有 2G 内存或以上
- Control-plane/Master至少 2U 或以上
- 各个主机之间网络相通
- 禁用交换分区
- 禁用 SELINUX
- 关闭防火墙(也可以设置相关防火墙规则)
如果不关闭防火墙需要开放的端口列表参考:
先进行防火墙、交换分区设置
# 为了方便本操作关闭了防火墙,也建议你这样操作
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
更换CentOS YUM源为阿里云yum源
# 安装wget
yum install wget -y
# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 获取阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 获取阿里云epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 清理缓存并创建新的缓存
yum clean all && yum makecache
# 系统更新
yum update -y
时间同步:
timedatectl
timedatectl set-ntp true
修改Hosts地址
# 所有节点执行
cat >> /etc/hosts << EOF
10.211.55.5 master
10.211.55.6 node01
10.211.55.7 node02
EOF
二、Docker安装
在每台机器上安装 Docker,我这里安装的是 docker-ce-20.10.1,具体步骤参考 CentOS 7.x 安装Docker或自行安装即可。
修改Cgroup Driver
需要将Docker 的 Cgroup Driver 修改为 systemd,不然在为Kubernetes 集群添加节点时会报如下错误:
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
查看docker当前的Cgroup Driver
$ docker info|grep "Cgroup Driver"
Cgroup Driver: cgroupfs
需要将这个值修改为 systemd ,同时将registry替换成国内的仓库地址操作如下。
# Setup daemon.
cat > /etc/docker/daemon.json <
三、 安装kubeadm、kubelet 和 kubectl
- kubeadm:用来初始化集群的指令
- kubelet:在集群中的每个节点上用来启动 pod 和容器等
- kubectl:用来与集群通信的命令行工具(Worker 节点可以不装)
更改源地址
# 所有节点执行
# 配置K8S的yum源 这部分用是阿里云的源,如果可以访问Google,则建议用官方的源,官方源参考下面的配置。两个配置选其一即可。
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
官网源
# 官方源配置如下
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
开始安装
安装指定版本 kubelet、 kubeadm 、kubectl,这里安装的是 Kubernetes 1.17.3,如果选择的版本不一样,在执行集群初始化的时候,注意 –kubernetes-version 的值是你的对应版本。
# 增加配置
cat < /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 加载
sysctl --system
# 安装
yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3 --disableexcludes=kubernetes
# 启动并设置 kubelet 开机启动
systemctl start kubelet
systemctl enable --now kubelet
⚠️ 如果安装K8s的最新版本,请检查KubeSphere是否支持该版本
四、Kubeadm创建集群
初始化 Control-plane/Master 节点
在master节点上使用 kubeadm init 命令执行初始化。首先会执行一系列的运行前检查来确保机器满足运行 Kubernetes 的条件,这些检查会抛出警告并在发现错误的时候终止整个初始化进程。 一切就绪后kubeadm init 会下载并安装集群的 Control-plane 组件。
# master节点执行
kubeadm init \
--apiserver-advertise-address 0.0.0.0 \
--apiserver-bind-port 6443 \
--cert-dir /etc/kubernetes/pki \
--control-plane-endpoint master \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version 1.17.3 \
--pod-network-cidr 10.10.0.0/16 \
--service-cidr 10.20.0.0/16 \
--service-dns-domain cluster.local \
--upload-certs
参数介绍
# 初始化 Control-plane/Master 节点
kubeadm init \
--apiserver-advertise-address 0.0.0.0 \
# API 服务器所公布的其正在监听的 IP 地址,指定“0.0.0.0”以使用默认网络接口的地址
# 切记只可以是内网IP,不能是外网IP,如果有多网卡,可以使用此选项指定某个网卡
--apiserver-bind-port 6443 \
# API 服务器绑定的端口,默认 6443
--cert-dir /etc/kubernetes/pki \
# 保存和存储证书的路径,默认值:"/etc/kubernetes/pki"
--control-plane-endpoint master \
# 为控制平面指定一个稳定的 IP 地址或 DNS 名称,
# 这里指定的 master 已经在 /etc/hosts 配置解析为本机IP
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
# 选择用于拉取Control-plane的镜像的容器仓库,默认值:"k8s.gcr.io"
# 因 Google被墙,这里选择国内仓库
--kubernetes-version 1.17.3 \
# 为Control-plane选择一个特定的 Kubernetes 版本, 默认值:"stable-1"
--node-name master01 \
# 指定节点的名称,不指定的话为主机hostname,默认可以不指定
--pod-network-cidr 10.10.0.0/16 \
# 指定pod的IP地址范围
--service-cidr 10.20.0.0/16 \
# 指定Service的VIP地址范围
--service-dns-domain cluster.local \
# 为Service另外指定域名,默认"cluster.local"
--upload-certs
# 将 Control-plane 证书上传到 kubeadm-certs Secret
等待一段时间....
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
# ⚠️⚠️⚠️ 这部分后面会用到!!!
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of the control-plane node running the following command on each as root:
# ⚠️⚠️⚠️ 添加集群master节点的需要执行的命令
kubeadm join kuber4s.api:6443 --token 0j287q.jw9zfjxud8w85tis \
--discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f \
--control-plane --certificate-key 528b0b9f2861f8f02dfd4a59fc54ad21e42a7dea4dc5552ac24d9c650c5d4d80
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
# ⚠️⚠️⚠️ 添加集群work节点需要执行的命令
kubeadm join kuber4s.api:6443 --token 0j287q.jw9zfjxud8w85tis \
--discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f
为普通用户添加 kubectl 运行权限,命令内容在初始化成功后的输出内容中可以看到。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
将master节点上的$HOME/.kube/config 文件拷贝到node节点对应的文件中
# 在node01、node02节点分别执行一遍如下命令
1.创建目录,这里的路径为/root
mkdir -p $HOME/.kube
2.把master节点上的config文件拷贝到node1和node2的$HOME/.kube
scp k8s-master1:~/.kube/config $HOME/.kube
3.修改权限
chown $(id -u):$(id -g) $HOME/.kube/config
这样修改后,在所有节点上执行kubctl命令时,不会出现如下错误:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
备份好 kubeadm init 输出中的 kubeadm join 命令,集群添加节点时会执行该命令。也可以通过如下命令查看token信息
# 在master节点使用如下命令查看token
$ kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
px979r.mphk9ee5ya8fgy44 20h 2020-03-18T13:49:48+08:00 authentication,signing system:bootstrappers:kubeadm:default-node-token
# 查看sha256
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
# 5e7c7cd1cc1f86c0761e54b9380de22968b6b221cb98939c14ab2942223f6f51
# 同时查看token和sha256
$ kubeadm token create --print-join-command
kubeadm join 10.211.55.5:6443 --token 9b28zg.oyt0kvvpmtrem4bg --discovery-token-ca-cert-hash sha256:5e7c7cd1cc1f86c0761e54b9380de22968b6b221cb98939c14ab2942223f6f51
将Node01、Node02加入到集群中
# 在Node01、Node02 分别执行如下命令将work节点加入集群。
kubeadm join 10.211.55.5:6443 --token 9b28zg.oyt0kvvpmtrem4bg --discovery-token-ca-cert-hash sha256:5e7c7cd1cc1f86c0761e54b9380de22968b6b221cb98939c14ab2942223f6f51
# 输出:
输出结果
[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.16" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
Master节点查看node,发现状态都是NotReady,因为还没有安装网络插件,这里我们安装calio
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 19m v1.16.9
node01 NotReady 4m10s v1.16.9
node02 NotReady 4m3s v1.16.9
Master节点安装网络插件
- 安装Pod网络插件,以使Pod可以相互通信,只需要在Master节点操作,其他新加入的节点会自动创建相关pod。
- 注意需要在部署应用程序之前部署网络组件。另外,在安装网络之前,CoreDNS将不会启动(你可以通过命令 kubectl get pods –all-namespaces|grep coredns 查看 CoreDNS 的状态)。
# 查看 CoreDNS 的状态,并不是 Running 状态
$ kubectl get pods --all-namespaces|grep coredns
kube-system coredns-7f9c544f75-bzksd 0/1 Pending 0 14m
kube-system coredns-7f9c544f75-mtrwq 0/1 Pending 0 14m
kubeadm 支持多种网络插件,我们选择 Calico 网络插件(kubeadm 仅支持基于容器网络接口(CNI)的网络),默认情况下,它给出的pod的IP段地址是 192.168.0.0/16 ,如果你的机器已经使用了此IP段,就需要修改这个配置项,将其值改为在初始化 Master 节点时使用 kubeadm init –pod-network-cidr=x.x.x.x/x 的IP地址段,即我们上面配置的 10.10.0.0/16(根据自己需求修改,但是注意要一致),大概在625行左右,操作如下:
# 下载文件
mkdir calico && cd calico
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
# 修改配置文件
# 找到 625 行左右的 192.168.0.0/16 ,并修改为我们初始化时配置的 10.10.0.0/16
vim calico.yaml
# 修改完成后安装calico网络插件
kubectl apply -f calico.yaml
# 安装完成后稍等一会查看pods状态,可能有的节点还在下载镜像
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-dc6cb64cb-8sh59 1/1 Running 0 6m22s
calico-node-89s9k 1/1 Running 0 6m22s
calico-node-dkt7w 1/1 Running 0 6m22s
calico-node-tgg2h 1/1 Running 0 6m22s
coredns-667f964f9b-7hrj9 1/1 Running 0 33m
coredns-667f964f9b-8q7sh 1/1 Running 0 33m
etcd-k8s-master 1/1 Running 0 33m
kube-apiserver-k8s-master 1/1 Running 0 32m
kube-controller-manager-k8s-master 1/1 Running 0 33m
kube-proxy-b2r5d 1/1 Running 0 12m
kube-proxy-nd982 1/1 Running 0 11m
kube-proxy-zh6cz 1/1 Running 0 33m
kube-scheduler-k8s-master 1/1 Running 0 32m
# 查看node状态
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 31m v1.16.9
node1 Ready 9m46s v1.16.9
node2 Ready 9m22s v1.16.9
其他
- kubeadm init 初始化 Kubernetes 主节点
- kubeadm token 管理 kubeadm join 的令牌
- kubeadm reset 将 kubeadm init 或 kubeadm join 对主机的更改恢复到之前状态,一般与 -f 参数使用
- 移除 worker 节点
正常情况下,你无需移除 worker 节点,如果要移除,在准备移除的 worker 节点上执行
kubeadm reset -f
- 或在Master上执行
# 节点名称可以在master上通过kubectl get nodes获得
kubectl delete node 节点名称
到此一个简单的K8s集群部署完成了。其他版本也是类似操作。下篇文章将在此基础上部署KubeSphere管理k8s集群。