基于Kubeadm安装Kubernetes部署方案
- 1 Kubernetes简介
- 2 Kubernetes功能
- 3 Kubernetes集群角色
- 4 Kubernetes架构
- 5 Kubernetes安装环境
- 6 基础环境部署
- 7 安装docker(所有节点)
- 8 升级系统内核(所有节点)
- 9 Kubernetes组件安装(所有节点)
- 10 初始化集群(master节点)
- 11 部署容器网络
- 12 测试Kubernetes集群
- 13 部署Dashboard
1 Kubernetes简介
Kubernetes是一个轻便和可扩展的开源云平台,用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署以及扩容和缩容等操作。在Kubernetes中,可以将组成应用的容器结合成一个逻辑单元,更易于管理和发现。
2 Kubernetes功能
- 自动装箱
基于容器对应用运行环境的资源配置要求自动部署应用容器。
- 自我修复
当容器失败时,会对容器进行重启;当所部署的Node节点出现问题时,会对容器进行重新部署和重新调度;当容器未通过监控检查时,会关闭此容器,直到容器正常运行时,才会对外提供服务。
- 水平扩展
通过简单的命令,对应用容器进行规模扩大或剪裁。
- 服务发现
用户不需要使用额外的服务发现机制就能够基于Kubernetes自身能力实现服务的发现和负载均衡。
- 滚动更新
可以根据应用的变化,对应用容器的应用进行一次性或批量更新。
- 版本回退
可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退。
- 密钥和配置管理
在不需要重新构建镜像情况下,可以部署和更新密钥以及应用配置。
- 存储编排
自动实现存储系统挂载及应用,尤其对有状态应用实现数据持久化十分重要。存储系统可以来自本地目录、网络存储(NFS、Gluster、Ceph、Cinder等)、公共云存储等。
3 Kubernetes集群角色
- Master Node
集群控制节点,对集群进行调度管理,接收集群外用户操作请求,由API Server、Scheduler、Cluster State Store(ETCD数据库)和Controller Server组成。
- Worker Node
集群工作节点,运行用户业务应用容器,由Kubelet、Kube Proxy和Container Runtime组成。
4 Kubernetes架构
架构说明:
- Etcd
保存整个集群的状态。
- API Server
提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。
- Controller Manager
负责维护集群的状态,如故障检测、自动扩展、滚动更新等。
- Scheduler
负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上。
- Kubelet
负责维护容器的生命周期、Volume(CVI) 和网络(CNI)的管理。
- Container Runtime
负责镜像管理以及Pod和容器的真正运行(CRI)。
- Kube-proxy
负责为Service提供Cluster内部的服务发现和负载均衡(四层)。
5 Kubernetes安装环境
本次部署三个节点,一个master节点,两个worker节点,如表5-1。
节点 | 系统 | 网卡:eth0 |
---|---|---|
master1 | Centos7.6 | 10.0.0.100 |
worker1 | Centos7.6 | 10.0.0.101 |
worker2 | Centos7.6 | 10.0.0.102 |
表5-1:安装环境
配置说明:
master1
- 内存:16G
- CPU:双核双线程,虚拟化开启
- 硬盘:300G
worker1/2
- 内存:16G
- CPU:双核双线程,虚拟化开启
- 硬盘:300G
6 基础环境部署
6.1 修改主机名(所有节点)
- master节点
hostnamectl set-hostname master1
- worker1节点
hostnamectl set-hostname worker1
- worker2节点
hostnamectl set-hostname worker2
6.2 配置域名解析(所有节点)
vi etc/hosts
10.0.0.100 master1
10.0.0.101 worker1
10.0.0.102 worker2
6.3 关闭防火墙与SELINUX(所有节点)
systemctl stop firewalld
systemctl disable firewalld
vi /etc/selinux/config
SELINUX=disabled
reboot
6.4 关闭swap分区(所有节点)
使用Kubeadm部署时必须关闭swap分区,此处采用将swap分区注释掉方式。
vi /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
reboot
6.5 配置时间同步(所有节点)
master节点与worker节点的时间需要同步,否则可能会出现意外问题。
- master1节点
yum install -y chrony
vi /etc/chrony.conf
allow 10.0.0.0/24
systemctl enable chronyd.service
systemctl start chronyd.service
- worker1/worker2节点
yum install -y chrony
vi /etc/chrony.conf
server 10.0.0.100 iburst
- 设置开机自启并启动
systemctl enable chronyd.service
systemctl start chronyd.service
6.6 配置优化(所有节点)
- 添加网桥过滤及地址转发,实现内核的过滤
vi /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
- 加载br_netfilter模块
modprobe br_netfilter
- 加载网桥过滤配置文件
sysctl -p /etc/sysctl.d/k8s.conf
- 所有节点开启ipvs
sysctl -p /etc/sysctl.d/k8s.conf
- 安装软件ipset和ipvsadm
yum install -y ipset ipvsadm
- 添加需要加载的模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
- 添加权限并应用
chmod 777 /etc/sysconfig/modules/ipvs.modules
sh /etc/sysconfig/modules/ipvs.modules
7 安装docker(所有节点)
7.1 安装docker依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
7.2 设置阿里镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
7.3 安装指定版本docker
yum -y install docker-ce-20.10.12-3.el7
7.4 设置开机自启并启动
systemctl enable docker
systemctl start docker
7.5 修改配置文件
vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
8 升级系统内核(所有节点)
由于CentOS 7.x 系统自带的3.10.x内核存在一些Bug,导致运行的Docker和Kubernetes不稳定,因此需要将系统内核升级至最新版本,升级步骤如下(如内核已是新版则跳过此步骤)。
- 安装工具wget和unzip
yum install -y curl wget unzip
- 导入ELRepo仓库的公共密钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
- 安装ELRepo仓库的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
- 安装最新版本内核
yum --enablerepo=elrepo-kernel install kernel-ml
- 设置新的内核为grub2的默认版本
grub2-set-default 0
- 生成grub配置文件并重启
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
9 Kubernetes组件安装(所有节点)
Kubernetes组件包含Kubeadm、Kubelet、Kubectl,功能如下。
- Kubeadm
初始化集群、管理集群等。
- Kubelet
接收api-server指令,对Pod生命周期进行管理。
- Kubectl
集群命令行管理工具。
9.1 配置Kubernetes的yum源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
9.2 安装组件
安装组件Kubeadm,Kubelet和Kubectl并指定版本。
yum makecache fast
yum install -y kubelet-1.21.3 kubeadm-1.21.3 kubectl-1.21.3
systemctl enable kubelet
修改配置文件。
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
10 初始化集群(master节点)
10.1 master节点初始化
在master节点上的任意路径下输入执行以下命令。
kubeadm init \
--apiserver-advertise-address=10.0.0.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
参数说明:
- apiserver-advertise-address
集群通告地址。
- image-repository
由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
- kubernetes-version
Kubernetes版本,与上面安装的一致。
- service-cidr
集群内部虚拟网络,Pod统一访问入口。
- pod-network-cidr
Pod网络,与下面部署的CNI网络组件yaml中保持一致。
正常初始化后,会提示下图10-1中的内容,并将箭头所指处复制到本地。
根据提示配置如下内容。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
10.2 镜像准备
查看集群使用的容器镜像。
[root@master1 ~]# kubeadm config images list
I0608 09:54:34.987170 2894 version.go:254] remote version is much newer: v1.24.1; falling back to: stable-1.21
registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.13
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.13
registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.13
registry.aliyuncs.com/google_containers/kube-proxy:v1.21.13
registry.aliyuncs.com/google_containers/pause:3.4.1
registry.aliyuncs.com/google_containers/etcd:3.4.13-0
registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
[root@master1 ~]#
生成脚本。
kubeadm config images list >> image.list
编辑脚本。
vi image.list
#!/bin/bash
img_list='registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.3
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.3
registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.3
registry.aliyuncs.com/google_containers/kube-proxy:v1.21.3
registry.aliyuncs.com/google_containers/pause:3.4.1
registry.aliyuncs.com/google_containers/etcd:3.4.13-0
registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0'
for img in ${img_list}
do
docker pull $img
done
执行脚本。
sh image.list
10.3 worker节点加入集群
将图10.1所指地方配置到worker1和worker2节点上。
kubeadm join 10.0.0.100:6443 --token wq53fj.x28gsb67wd3josc4 \
--discovery-token-ca-cert-hash sha256:ecabaf79ece2225a8d52b0febe03001ad512ada9dd8b26926161a85a341ac6f9
master节点查看集群。
kubectl get nodes
11 部署容器网络
本文档使用Calico部署容器网络,Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案,步骤如下。
- 下载yaml
wget https://docs.projectcalico.org/manifests/calico.yaml
- 应用calico.yaml
kubectl apply -f calico.yaml
- 查看部署进度,全部为running后则正常
[root@master1 ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-685b65ddf9-hgjx7 1/1 Running 0 148m
calico-node-8ngrz 1/1 Running 0 148m
calico-node-p2lc9 1/1 Running 0 148m
calico-node-r2tkg 1/1 Running 0 148m
coredns-59d64cd4d4-fqfq9 1/1 Running 0 163m
coredns-59d64cd4d4-zcph8 1/1 Running 0 163m
etcd-master1 1/1 Running 0 163m
kube-apiserver-master1 1/1 Running 0 163m
kube-controller-manager-master1 1/1 Running 0 163m
kube-proxy-lszzs 1/1 Running 0 162m
kube-proxy-pbjhs 1/1 Running 0 163m
kube-proxy-wjl7x 1/1 Running 0 162m
kube-scheduler-master1 1/1 Running 0 163m
[root@master1 ~]#
12 测试Kubernetes集群
在Kubernetes集群中创建一个Pod,验证是否正常运行。
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
结果如下图12-1。
验证Kubernetes可以保持一定个数容器运行的功能,此处把replicas修改为3如下。
kubectl scale --replicas=3 deployment/nginx
kubectl get pod -o wide
尝试删除一个正在运行中的Pod。
kubectl delete pod nginx-6799fc88d8-dcxql
再次查看Pod数量。
kubectl get pod -o wide
可以看到之前的ip为10.244.235.136的Pod已经被删除,并产生了新的Pod,ip为10.244.235.137,说明Kubernetes功能正常。
检查各ip的连通性。
ping各Pod的ip:10.244.235.141、10.244.235.140、10.244.189.72,如下图12-5、12-6、12-7。
curl service的ip:10.107.23.235,如图12-8。
curl node:ip测试,如图12-9、12-10、12-11。
Pod与Pod连通性测试,如图12-12。
检查DNS解析可用性,如图12-13。
访问地址:http://<任意node的ip>:port,此处访问:10.0.0.101:31339,结果如图12-14。
测试结果:无异常。
13 部署Dashboard
Dashboard是官方提供的一个UI,可用于管理Kubernetes资源。
master节点输入如下命令。
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
默认Dashboard只能集群内部访问,可以修改recommended.yaml文件中Service类型为nodeport,方便集群外的机器访问。
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30443
selector:
k8s-app: kubernetes-dashboard
type: NodePort
再次输入如下命令。
kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard
待所有Pod处于running的状态后,创建service account并绑定默认cluster-admin管理员集群角色。
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
访问地址:https://<任意node的ip>:30443,将上条命令产生的token复制后填入,进行登录,如图13-1,13-2。
至此一个可用的kubernetes集群安装完毕。
更多内容请参考:A-Lab