Centos搭建k8s

在CentOS 7上搭建Kubernetes集群

kubeadm官方文档
https://blog.51cto.com/zhangxueliang/4952945

前置步骤(所有结点)

  • CentOS 7.9 物理机或虚拟机三台,CPU 内核数量大于等于 2,且内存大于等于 4G
  • hostname 不是 localhost,且不包含下划线、小数点、大写字母
  • 任意节点都有固定的内网 IP 地址(集群机器统一内网)
  • 任意节点上 IP 地址 可互通(无需 NAT 映射即可相互访问),且没有防火墙、安全组隔离
  • 任意节点不会直接使用 docker run 或 docker-compose 运行容器和Pod

关闭防火墙,或者阿里云开通安全组端口访问

$ sudo systemctl stop firewalld & sudo systemctl disable firewalld

关闭selinux

$ sed -i 's/enforcing/disabled/' /etc/selinux/config
$ setenforce 0

永久关闭swap

$ swapoff -a
$ sed -ri 's/.*swap.*/#&/' /etc/fstab

将桥接的 IPv4 流量传递到 iptables 的链。修改/etc/sysctl.conf

net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
net.ipv6.conf.all.forwarding=1

执行命令以应用

$ sudo sysctl -p

安装容器运行时(所有结点)

下面的过程安装了docker v23.0, containerd v1.6.18, nerdctl v1.2.1。

按照docker官方文档 即可。

为了规避问题1 以及问题2 需要修改所有结点上的containerd配置(参考这里):

$ cat <

安装nerdctl

$ wget https://github.com/containerd/nerdctl/releases/download/v1.2.1/nerdctl-1.2.1-linux-amd64.tar.gz
$ tar xzvf nerdctl-1.2.1-linux-amd64.tar.gz
$ sudo cp nerdctl /usr/local/bin/
$ sudo nerdctl namespace ls

安装Kubernetes(所有结点)

卸载旧版本

$ sudo yum remove -y kubelet kubeadm kubectl

配置k8s源。准备文件/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

安装kubelet、kubeadm、kubectl

$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

启动kubelet。注意,如果此时查看kubelet的状态,他会无限重启,等待接收集群命令,和初始化。这个是正常的。

$ sudo systemctl enable kubelet && systemctl start kubelet

国外镜像下载问题

因谷歌网络限制问题,国内的K8ser大多数在学习Kubernetes过程中因为镜像下载失败问题间接地产生些许失落感,笔者也因此脑壳疼,故翻阅资料得到以下解决方式:
在应用yaml文件创建资源时,将文件中镜像地址进行内容替换即可:

  • k8s.gcr.io 地址替换为registry.aliyuncs.com/google_containers
  • quay.io 地址替换为quay.mirrors.ustc.edu.cn或者quay-mirror.qiniu.com
  • gcr.io地址替换为registry.aliyuncs.com

kubeadm依赖的所有镜像可以用如下脚本下载:

$ echo <" $imageMirror
   docker pull $imageMirror
   docker tag $imageMirror $image
   docker rmi $imageMirror
done
EOF
$ sudo bash kubeadm-images.sh

新版本的kubeadm不再需要上述trick,选项--image-repository指向国内mirror即可。

初始化master结点(单个master结点)

初始化master,成功将输出“初始化worker结点”的命令

$ sudo kubeadm init --image-repository=registry.aliyuncs.com/google_containers
[init] Using Kubernetes version: v1.26.1
......

如果init失败,可以"kubeadm reset --force"后再次尝试。

配置kubectl

$ export KUBECONFIG=/etc/kubernetes/admin.conf

nerdctl文档指出:containerd中的container和image都有namespace属性。默认default,kubernetes用的是k8s.io。
按namespace统计容器和image数量

$ sudo nerdctl namespace ls
NAME      CONTAINERS    IMAGES    VOLUMES    LABELS
k8s.io    21            36        0              
moby      0             0         0              

列出所有kubernetes本地容器

$ sudo nerdctl -n k8s.io ps

初始化worker结点(多个worker结点)

使用刚才master打印的令牌命令加入。如果下面命令失败,可从上一节"初始化master结点"从头再来。

$ sudo kubeadm join 192.168.110.48:6443 --token dna6ti.7hu4gx3r43rid67w --discovery-token-ca-cert-hash sha256:d68e1e0398dadac6d7196faac56bc9447a499203f30a1e46daf874d59aaf493d

如果超过2小时忘记了令牌,可在master上执行如下命令再次打印令牌

$ sudo kubeadm token create --print-join-command

在master结点观察worker结点状态

$ kubectl get nodes  
NAME   STATUS   ROLES           AGE    VERSION  
vm48   Ready    control-plane   85m    v1.26.1  
vm49   Ready              8m1s   v1.26.1  
vm50   Ready              41s    v1.26.1

配置pod网络插件calico

注意:官方文档已指出,在安装pod网络插件之前,coredns不会启动。
Calico在Cilium之后添加了基于eBPF的数据面 ,用户可在iptables和eBPF之间选择,默认是iptables。

部署calico

$ curl -o calico-v3.25.yaml https://raw.githubusercontent.com/projectcalico/calico/release-v3.25/manifests/calico.yaml
$ kubectl apply -f calico-v3.25.yaml

查看状态,等待calico和coredns相关pod就绪。注意,coredns仅在部署pod网络插件后启动

$ watch kubectl get pod -n kube-system -o wide

冒烟测试:部署nginx服务,测试dns解析服务名

$ cat <

你可能感兴趣的:(docker,kubernetes,运维)