部署k8s集群

322 阅读3分钟

新公司提供了公有云的环境,这样以后就不需要用笔记本上搭建集群,因为在win10上用wsl2和docker上,莫名其妙的会内存溢出,本人48g的笔记本,没启动几个容器,就会消耗20多g的内存,而且内存占用还在不断的增长。

但是公有云上并没有给我们直接使用容器服务的权限,那就自己搭建一套,满足灵活使用,整个工作栈向云原生转型。

1. 环境准备

服务器配置

操作系统:centos7.9

硬件配置:4core cpu,16GB内存,80GB系统盘,100GB数据盘

这种配置按需付费的话,大概每小时8毛多,价格还可以

服务器规划:

master: 192.168.48.210
node1: 192.168.48.211
node2: 192.168.48.212

建互信:

yum install -y sshpass

ssh-keygen -t rsa -b 4096

for node in {master,node1,node2};
do sshpass -p <password> ssh-copy-id -o StrictHostKeyChecking=no root@$node; done

2. 初始化安装

以下操作需要在所有节点上进行

2.1 系统环境准备

关闭防火墙

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 # 永久

根据规划设置主机名

hostnamectl set-hostname <hostname>

在master添加hosts

cat >> /etc/hosts << EOF
192.168.48.210  master
192.168.48.211  node1
192.168.48.212  node2
EOF

将桥接的IPv4流量传递到iptables的链

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system # 生效

时间同步,在公有云上会统一进行,无须设置

yum install ntpdate -y
ntpdate time.windows.com

为了集群的稳定性和兼容性,生产环境的内核最好升级到4.18版本以上

wget https://ossjc-1252545319.cos.ap-shanghai.myqcloud.com/other/linux/kernel-ml-4.18.9/kernel-ml-4.18.9.tar.gz
tar xf kernel-ml-4.18.9.tar.gz
cd kernel-ml-4.18.9
yum localinstall kernel-ml* -y

##切换内核
grub2-set-default 0
##或者
grub2-set-default 'CentOS Linux (4.18.9-1.el7.elrepo.x86_64) 7 (Core)' 
grub2-mkconfig -o /boot/grub2/grub.cfg 

##重启系统
reboot

##检查内核
uname -a

2.2 安装 Docker、kubeadm、kubelet

安装docker:

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker

配置镜像下载加速器:

vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}

systemctl restart docker
docker info #查看docker信息,进行确认

打开CRI(Container Runtime Interface)的远程调用接口,这个接口定义了容器运行时的各项核心操作

vim /etc/containerd/config.toml
##注释掉:
#disabled_plugins : ["cri"]

systemctl restart containerd 

添加阿里云软件源:

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

安装kubeadm、kubelet、kubectl:

yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
systemctl enable kubelet

2.3 部署k8s的master节点

kubeadm部署(master节点操作)

kubeadm init \
--apiserver-advertise-address=192.168.48.210 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all

初始化完后,最后会显示以下内容,予以保留,后续添加节点时用该命理在node节点上执行:

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.48.210:6443 --token m4j608.hogj6raizuklca5k \
--discovery-token-ca-cert-hash sha256:5f720870ebfa1549a3ce4f6ca4249752012b18c8186be92b72cd2f3b905631a6

拷贝k8s认证文件

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看工作节点:

kubectl get nodes

由于网络插件还没有部署,还没有准备就绪 NotReady,继续操作。

2.4 配置k8s的node节点

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:

kubeadm join 192.168.48.210:6443 --token m4j608.hogj6raizuklca5k \
--discovery-token-ca-cert-hash sha256:5f720870ebfa1549a3ce4f6ca4249752012b18c8186be92b72cd2f3b905631a6

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:

kubeadm token create --print-join-command

2.5 部署 CNI 网络插件

在上述操作完成后,各个工作节点已经加入了集群,但是它们的状态都是 NoReady,这是由于无它们无法跨主机通信的原因。而 CNI 网络插件的主要功能就是实现 pod 资源能够跨宿主机进行通信。在master节点中执行以下命令进行配置:

wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml --no-check-certificate

下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样

vim calico.yaml

##找到下面参数修改
- name: CALICO_IPV4POOL_CIDR
               value: "10.244.0.0/16"

修改完后文件后,进行部署:

kubectl apply -f calico.yaml

执行结束要等上一会才全部running

kubectl get pods -n kube-system

注:以后所有yaml文件都只在Master节点执行。

安装目录:/etc/kubernetes/

组件配置文件目录:/etc/kubernetes/manifests/

3 部署Dashboard

Dashboard是官方提供的一个UI,可用于基本管理K8s资源。

YAML下载地址:

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

vi recommended.yaml

...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort
...

安装dashboard

kubectl apply -f recommended.yaml

访问地址 https://192.168.48.210:30001/

需要创建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
## 获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

错误处理

- unable to load bootstrap kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory

备份并重新生成证书

cd /etc/kubernetes/pki/
mkdir backup
mv  apiserver.crt apiserver-etcd-client.key apiserver-kubelet-client.crt front-proxy-ca.crt front-proxy-client.crt front-proxy-client.key front-proxy-ca.key apiserver-kubelet-client.key apiserver.key apiserver-etcd-client.crt backup
kubeadm init phase certs all

备份并重新生成配置文件

cd /etc/kubernetes/
mkdir backup
mv admin.conf controller-manager.conf kubelet.conf,scheduler.conf  backup
kubeadm init phase kubeconfig all