K8S集群部署
测试环境最低硬件要求:
1)CPU:2c
2)内存:4G
3)硬盘:50G
机器准备
准备工作(三台机器都操作)
关闭selinux和firewalld
为了保证k8s节点之间的正常通信,需要关闭firewalld。
为了保证k8s节点对系统的正常操作,需要关闭SELinux
临时关闭Selinux:
setenforce 0永久关闭Selinux:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config关闭firewalld:
systemctl disable firewalld; systemctl stop firewalld设置主机名
hostnamectl set-hostname bs-m1 # bs-m1上执行
hostnamectl set-hostname bs-n1 # bs-n1上执行
hostnamectl set-hostname bs-n2 # bs-n2上执行编辑/etc/hosts
cat >> /etc/hosts <<EOF
192.168.19.6 bs-m1
192.168.19.8 bs-n1
192.168.19.9 bs-n2
EOF关闭swap
临时关闭:
swapoff -a 永久关闭:
vi /etc/fstab #注释掉swap那行将桥接的ipv4流量传递到iptables链
生成bridge相关内核参数
modprobe br_netfilter
将内核参数写入配置文件
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1 # 控制IPv6数据包经过网桥时,传递给ip6tables规则进行处理
net.bridge.bridge-nf-call-iptables = 1 # 控制IPv4数据包经过网桥时,传递给iptables规则进行处理
net.ipv4.ip_forward = 1
EOF
使内核参数生效
sysctl --system
或者
sysctl -p /etc/sysctl.d/k8s.conf
设置时间同步
yum install -y chrony
systemctl start chronyd
systemctl enable chronyd
安装containerd(三台机器都操作)
从Kubernetes 1.20版本开始,Kubernetes官方支持使用Docker和Containerd作为容器运行时使用。从Kubernetes 1.24版本开始,Docker作为容器运行时正式被官方弃用,Containerd成为唯一推荐的容器运行时
安装yum-utils工具
yum install -y yum-utils
配置Docker官方的yum仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装docker因为一些原因导致国内无法安装。
安装docker服务需要给对应的yum仓库配置代理才行。否则无法安装。
安装docker镜像也需要在docker的daemon.json中指定代理才能使用。
yum安装containerd
yum install containerd.io -y
启动containerd服务
systemctl enable containerd
systemctl start containerd
修改sandbox镜像地址----生成默认配置文件
containerd config default > /etc/containerd/config.toml
修改配置文件
vi /etc/containerd/config.toml ##改如下内容
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9" # 修改为阿里云镜像地址
SystemdCgroup = truepause容器是Pod 的基础容器,用来持有 namespace(尤其是网络 namespace),为 Pod 内所有容器提供共享的运行环境。
sed -i 's|sandbox_image.*|sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"|g' /etc/containerd/config.toml
sed -i 's|SystemdCgroup.*|SystemdCgroup = true|g' /etc/containerd/config.toml
重启containerd服务
systemctl restart containerd
配置代理(必须设置代理(这里的代理为科学上网的代理),否则镜像拉取不下来)
# 查看containerd的systemd管理文件位置
systemctl status containerd.service
# 编辑服务管理文件,在[Service]单元下面增加内容
Environment="HTTP_PROXY=http://proxy.wlinux.top:8083/"
Environment="HTTPS_PROXY=http://proxy.wlinux.top:8083/"
Environment="NO_PROXY=192.168.0.0/16,127.0.0.1/8,10.0.0.0/8,172.16.0.0/12,169.254.0.0/16,aliyuncs.com"
重启containerd服务
systemctl daemon-reload
systemctl restart containerd安装kubeadm和kubelet(三台机器都操作)
配置kubernetes仓库
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
yum install -y kubelet-1.26.2 kubeadm-1.26.2 kubectl-1.26.2
启动kubelet服务
systemctl start kubelet.service
systemctl enable kubelet.service设置crictl连接containerd
crictl config --set runtime-endpoint=unix:///run/containerd/containerd.sock
crictl config --set image-endpoint=unix:///run/containerd/containerd.sock
crictl config --set timeout=10查看设置后的crictl的配置,配置文件:【/etc/crictl.yaml】
cat /etc/crictl.yaml
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 10
debug: false
pull-image-on-create: false
disable-pull-on-run: false
初始化
使用kubeadm初始化k8s(M1上操作)
其要做的事情是将k8s核心的各个组件用容器的形式运行起来,包括aip-server、controller-manager等
kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.19.6 --kubernetes-version=v1.26.2 --service-cidr=192.168.24.0/24 --pod-network-cidr=192.168.25.0/24
其中有一段输出是这样的:
kubeadm join 192.168.19.6:6443 --token 0qkyg0.2x7y4q2cfcxu6fbx \
--discovery-token-ca-cert-hash sha256:0b3469255aed7441cad08f3e54668c8d406d841418866229020c5919301fea27
上面这条命令就是如果需要将node节点加入到集群需要执行的命令,这个token有效期为24小时,如果过期,可以使用下面命令获取
kubeadm token create --print-join-command
创建配置文件(M1上操作)
这个配置文件指的是,k8s管理员用户的相关配置,如果没有这个配置,我们是无法使用命令行工具去访问k8s里的资源对象的(如,pod、deployment、service等)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
如果worker节点需要能使用kubectl命令,在worker节点执行下面命令
mkdir -p $HOME/.kube
scp k8s-master:/etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
此时就可以执行如下命令来获取节点、pod信息了:
kubectl get node # 获取节点信息
kubectl get pod --all-namespaces # 获取所有pod信息
安装完网络插件后,coredns才会正常
node节点加入master(N1和N2上操作)
Kubernetes集群每个节点默认允许运行110个pod。
kubeadm join 192.168.19.6:6443 --token 0qkyg0.2x7y4q2cfcxu6fbx \
--discovery-token-ca-cert-hash sha256:0b3469255aed7441cad08f3e54668c8d406d841418866229020c5919301fea27
查看node信息(M1上操作)
kubectl get node ##可以看到有三个节点
默认输出的结果如下,worker节点对应的ROLES的值为none
[root@bs-m1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
bs-m1 Ready control-plane 4h55m v1.26.2
bs-n1 Ready <none> 177m v1.26.2
bs-n2 Ready <none> 177m v1.26.2
将工作节点的值标记为worker
[root@bs-m1 ~]# kubectl label node bs-n1 node-role.kubernetes.io/worker=worker
[root@bs-m1 ~]# kubectl label node bs-n2 node-role.kubernetes.io/worker=worker
再次查看所有节点的信息
[root@bs-m1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
bs-m1 Ready control-plane 4h59m v1.26.2
bs-n1 Ready worker 3h1m v1.26.2
bs-n2 Ready worker 3h v1.26.2
安装网络插件(M1上操作)
此时k8s还不能正常工作,因为它的网络插件还未安装,各组件之间还不能正常通信,下面我们来安装calico网络插件
部署calico插件
下载部署calico的yaml文件
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml -O修改yaml文件,定义网段配置
vim calico.yaml ##找到如下内容
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
# 修改为:
- name: CALICO_IPV4POOL_CIDR
value: "192.168.25.0/24" # 规划的pod网络信息部署calico
kubectl apply -f calico.yaml查看pod
kubectl get pod -n kube-system等所有pod都是running状态才算正常