本文带大家了解K8S平台的搭建,本文采用三节点(一个master,两个node)安装方式。所用系统:CentOS 7.9.2009
操作系统初始化
首先做的是每台服务器的配置初始化,依次按如下步骤初始化。
① 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
② 关闭 selinux
#临时生效
setenforce 0
#永久生效
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
③ 关闭 swap
#临时关闭
swapoff -a
#永久关闭,重启生效
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
④ 配置内核参数
配置内核参数,将桥接的IPv4流量传递到iptables的链
yum install -y bridge-utils yum-utils
# 加载br_netfilter模块,使用lsmod查看开启的模块
modprobe br_netfilter
cat <<EOF > /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system # 重新加载所有配置文件
⑤ 设置系统用户名
# 分别在不同对应主机设置系统相关用户名
hostnamectl set-hostname k8s-master-1
⑥ 添加 hosts
vim /etc/hosts
192.168.17.130 k8s-master-1
192.168.17.131 k8s-node-1
192.168.17.133 k8s-node-2
⑦ 配置国内yum源
不建议使用CentOS 7自带的yum源,因为安装部分软件和依赖时会非常慢甚至超时失败。使用阿里云的源予以替换,执行如下命令:
mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
yum -y update
安装 Docker
注:以下所有节点皆安装Docker / k8s组件
CentOS 安装参考官方文档:https://docs.docker.com/install/linux/docker-ce/centos/
① 卸载旧版本docker及组件
yum remove docker docker-common docker-selinux
② 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
③ 安装 Docker 软件包源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
④ 安装 Docker CE
# 选择查看docker-ce各版本
yum list docker-ce --showduplicates | sort -r
# 安装指定版本的docker-ce
yum install docker-ce-20.10.6 -y
⑤ 启动 Docker 服务
systemctl start docker
⑥ 设置开机启动
systemctl enable docker
⑦ 验证安装是否成功
docker -v
docker info
修改docker cgroup驱动,与k8s一致,使用systemd
# 修改docker cgroup驱动:native.cgroupdriver=systemd
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
systemctl restart docker # 重启docker使配置生效
安装k8s组件
配置k8s yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
可以看出当前安装的k8s的版本为1.21.0
开机启动kubelet
systemctl enable --now kubelet # 开机启动kubelet
部署master节点
在master进行k8s集群初始化
根据前一步安装信息,安装相应版本的k8s(此处为1.21.0)
kubeadm init --kubernetes-version=1.21.0 \
--apiserver-advertise-address=192.168.17.130 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
此处需要科学上网才能将需要镜像下载下来,网络教程上的相关阿里源经测试发现不可用,且未找到相关的第三方源,此处可用docker上的替代镜像下载下来重打tag后也可使用,重打tag后执行上述命令后检测到镜像都有话就不会再去额外pull镜像。(此处需要一部分docker相关使用知识。可自行搜索下如何docker重打tag)
定义POD的网段为:10.244.0.0/16,api server地址就是master本机IP地址。
记录生成的最后部分内容(如下),此内容需要在其它node节点加入k8s集群时执行(暂不执行)。
kubeadm join 192.168.17.130:6443 --token ldg7y7.btxdr0y9ed0jonyz \
--discovery-token-ca-cert-hash >sha256:faf9ffddaf79ec950391abe4fa5fb6baf63374a530e76fd2615a537bfb624b23
初始化过程说明:
- [preflight] kubeadm 执行初始化前的检查。
- [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
- [certificates] 生成相关的各种token和证书
- [kubeconfig] 生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信
- [control-plane] 安装 Master 组件,会从指定的 Registry 下载组件的 Docker 镜像。
- [bootstraptoken] 生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
- [addons] 安装附加组件 kube-proxy 和 kube-dns。 Kubernetes Master 初始化成功,提示如何配置常规用户使用kubectl访问集群。 提示如何安装 Pod 网络。 提示如何注册其他节点到 Cluster。
配置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节点部署flannel网络
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
将master节点作为工作节点(可选)
k8s集群默认不会将Pod调度到master上,这样master的资源就浪费了。在master上,可以运行以下命令使其作为一个工作节点(下方的k8s-master-1为你的k8s的master节点名称,若不一致请替换,下同):
kubectl taint node k8s-master-1 node-role.kubernetes.io/master-
若后期将Master节点恢复成Master Only状态,则执行如下命令恢复:
kubectl taint node k8s-master-1 node-role.kubernetes.io/master="":NoSchedule
此时在node节点执行以下命令:
kubeadm join 192.168.17.130:6443 --token ldg7y7.btxdr0y9ed0jonyz \
--discovery-token-ca-cert-hash sha256:faf9ffddaf79ec950391abe4fa5fb6baf63374a530e76fd2615a537bfb624b23
验证集群是否正常
当所有节点加入集群后,稍等片刻,在master节点上运行kubectl get nodes
可以看到:
如上,若提示notReady则表示节点尚未准备好,可能正在执行其他初始化操作,等待全部变为Ready即可。
另外,建议查看所有pod状态,运行kubectl get pods -n kube-system
:
如上,全部Running则表示集群正常。至此,k8s集群就搭建完成了。
安装dashboard
注:此操作只需在Master上操作
下载安装dashboard用yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
修改kubernetes-dashboard的service类型为NodePort类型
修改kubernetes-dashboard的service类型为NodePort类型,使用nodeport方式访问Dashboard 。
[root@k8s-master-1 dashboard]# vim recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort # 新增
ports:
- port: 443
targetPort: 8443
nodePort: 30443 # 新增
selector:
k8s-app: kubernetes-dashboard
安装Dashboard
kubectl create -f recommended.yaml
确认Dashboard 关联pod和service的状态
kubectl get pod,svc -n kubernetes-dashboard
创建serviceaccount和clusterrolebinding资源YAML文件
[root@k8s-master-1 ~]# vim adminuser.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
创建admin-user并且赋予admin-user集权管理员权限
kubectl create -f adminuser.yaml
浏览器访问Dashboard UI
浏览器访问https://IP:30443
查看token
获取token,用于登录Dashboard UI
[root@k8s-master-1 ~]# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
Name: admin-user-token-4xsrc
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: 31eefad2-a203-49ac-99ec-e7372aefb096
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1066 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjRVUUp2SlkxeGVValphWUZQbWRWZlZDR2RiYWRyZ0JLNjlwZ0Z1TVBEMWcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWprdnRkIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxYWYyZGE4Zi04ZTI5LTQ5MzktYjM4ZC1mNzc0Mjg0OGJlMWQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.Y9V2j56RXucVkoZfdQmHquRDK2XGAMT1E4VvooEXuh0TtJRLMhXxBPuPOLv0CMQbShSwglZnjH_NTdCm9NNhVgBERS0c-71_mnLhlMtmtfdCTsYLApOJGkDij8NZFwZSmg1JMjg009ycykhMBMLbVffBb-eCS7AY-InJowdVxgXsT3c6ra0CteNQMVtGv75FAE0OjWLb-qmuI7otuojvoQxegZ0zmIYhtz486f7stqPkZNWZijGHjvmo5NQCEroVxId4rOib2PFRD_wjqA_-43oIScQR77vdUcN5X8Yu_FH9D5hKV-jSnamHu8E79iltUTR9iEHOLZ69jIWMAm2jAw
登录Dashboard UI
输入第二部获取到的token值,点击登录按钮
K8S卸载
若需卸载K8S集群,下方提供相关卸载操作(所有节点皆需执行):
重置K8S:
kubeadm reset
清理:
kubeadm reset -f
modprobe -r ipip
lsmod #列出模块
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd