1 环境规划
1.1 服务规划
主机 | IP | 配置 | 角色 |
k8s-master | 192.168.0.127 | 4C8G | k8s集群master节点 |
k8s-node1 | 192.168.0.65 | 4C8G | k8s集群worker节点 |
k8s-node2 | 192.168.0.128 | 4C8G | k8s集群worker节点 |
1.2 版本说明
资源 | 版本信息 |
服务器操作系统 | CentOS Linux release 7.9.2009 (Core) |
服务器内核 | 3.10.0-1160.59.1.el7.x86_64 |
kubernetes版本 | v1.19.6 |
docker版本 | 19.03.15 |
2 kubernetes部署
2.1 服务器初始化
2.1.1 关闭防火墙、selinux、swap
-- 关闭防火墙自启
systemctl stop firewalld
systemctl disable firewalld
-- 关闭selinux
setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config
-- 关闭swap
swapoff -a
sed -ri 's/.swap./#&/' /etc/fstab
2.1.2 修改主机名
-- 分别在各个服务上按照服务器规划设置主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
-- 配置host文件
cat >> /etc/hosts << EOF
192.168.0.127 k8s-master
192.168.0.65 k8s-node1
192.168.0.128 k8s-node2
EOF
2.2 k8s环境初始化
以下初始化环境需要在集群各个节点执行。
2.2.1 安装docker
在v1.20之前,kubernetes依赖docker的容器运行时,来负责进行容器镜像拉取,所以需要提前安装对应支持的docker版本。在v1.20之后,kubernetes为了解决docker整个运行容器链路的冗长性,选择弃用了docker,转而采用了 Container Runtime Interface (CRI) 来替代容器的运行时,使用containerd 、CRI-O 来兼容对容器的运行时,极大的简化了容器运行时的链路。
-- 这里kubernetes是1.19,默认的容器仍然是docker
-- 安装docker环境的依赖包
# yum install -y yum-utils device-mapper-persistent-data lvm2 containerd
-- 设置docker源
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
或者
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-- 安装docker19.03.15
# yum list docker-ce --showduplicates | sort -r|grep 19.03
# yum install -y docker-ce-19.03.15-3.el7 docker-ce-cli-19.03.15-3.el7
-- 查看安装的版本
# docker -v
Docker version 19.03.15, build 99e3ed8919
-- 修改docker的从group driver
1. 启动docker
# systemctl start docker
2. 查看docker driver
# docker info|grep Cgroup
Cgroup Driver: cgroupfs
3. 修改docker driver
# vim /etc/docker/daemon.json # 修改或创建
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
-- 设置docker开机自启
systemctl restart docker
systemctl enable docker
systemctl status docker
2.2.2 安装kubeadm、kubelet、kubectl
-- 设置k8s的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
-- 安装kubernetes1.19.6
yum list -y kubeadm --showduplicates|grep 1.19
yum install -y kubeadm-1.19.6-0 kubectl-1.19.6-0 kubelet-1.19.6-0
-- 查看版本
kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.6", GitCommit:"fbf646b339dc52336b55d8ec85c181981b86331a", GitTreeState:"clean", BuildDate:"2020-12-18T12:07:25Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
2.3 部署master节点
以下所有步骤均是在master节点操作。
2.3.1执行kubeadm init进行初始化
# kubeadm init --kubernetes-version=v1.19.6 \
--apiserver-advertise-address=192.168.0.127 \ # apiserver地址,即master节点ip
--service-cidr=10.1.0.0/16 \ # service IP 网段
--pod-network-cidr=10.244.0.0/16 \ # pod IP 网段
--image-repository=registry.aliyuncs.com/google_containers
在初始化这一流程中,主要进行了一下工作:
- [preflight]:kubeadm 执行初始化前的检查。
- [certificates]:生成相关的各种token和证书
- [kubelet-start]:生成kubelet的配置文件"/var/lib/kubelet/config.yaml"
- [kubeconfig]:生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信
- [control-plane]:安装 Master 组件,会从指定的 Registry 下载组件的 Docker 镜像
- [bootstraptoken]:生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
- [addons]:安装附加组件 kube-proxy 和 kube-dns。 Kubernetes Master 初始化成功,提示如何配置常规用户使用kubectl访问集群。 提示如何安装 Pod 网络。 提示如何注册其他节点到 Cluster
2.3.2 配置kubectl
-- 新建kubect的配置目录
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
-- 启用 kubectl 命令自动补全功能
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc
-- 设置kubelet自启
systemctl enable kubelet
systemctl status kubelet
此时如果我们通过kubectl get all -n kube-system ,可以发现coredns相关的pod处于pending状态,这是由于我们的集群master节点还未安装相关的网络插件。
2.3.3 安装网络插件
-- 安装flannel网络插件
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# kubectl apply -f kube-flannel.yml
如果无法访问,可以直接下载代码仓库https://github.com/coreos/flannel,将kube-flannel.yml上传到k8s-master节点需要能访问quay.io,不然就需要换其他的源,然后执行 kubectl apply
2.4 部署worker节点
2.4.1 worker节点加入
-- 在集群master节点查看集群节点添加命令
# kubeadm token create --print-join-command
kubeadm join 192.168.0.127:6443 --token 2yus3o.5s5b8bb466zmkbza --discovery-token-ca-cert-hash sha256:856f54dff402531039bd138523262a45ff20d7a668ef01121b90bb7e83f59d1b
-- 在worker节点执行集群节点加入命令
# kubeadm join 192.168.0.127:6443 --token 2yus3o.5s5b8bb466zmkbza --discovery-token-ca-cert-hash sha256:856f54dff402531039bd138523262a45ff20d7a668ef01121b90bb7e83f59d1b
-- 查看集群状态
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 22h v1.19.6
k8s-node1 Ready <none> 21h v1.19.6
k8s-node2 Ready <none> 21h v1.19.6