Personal learning records
Kubernetes 集群搭建
Kubernetes 集群搭建

Kubernetes 集群搭建

之前写过的Docker Compose是一个基于Docker的单主机容器编排工具,而k8s是一个跨主机的集群部署工具。在扩展性和可靠性以及自我修复方面相比前者有巨大的优势。

  • kube-apiserver:是 Kubernetes 控制面的组件
  • etcd:兼具一致性和高可用性的文档数据库,保存 Kubernetes 所有集群数据的后台数据库
  • kube-scheduler:负责将新创建的 Pod 分配到集群中的节点上
  • kube-controller-manager:负责运行多个控制器进程,监控和管理集群中的各种资源
  • Node 组件:在每个节点上,维护运行的 Pod 并提供 Kubernetes 运行环境
  • kubelet:每个节点上运行的代理,保证容器运行在pod里
  • kube-proxy:每个节点上运行的网络代理
  • 容器运行时:负责运行容器的软件,在我的集群中,简单来说就是docker

k8s集群部署

使用官方提供的kubeadm方式部署,相比二进制部署更快更方便。本地虚拟机三台,主节点最低2核2g,否则启动失败。先把必要的镜像下载下来,由于docker官方镜像国内访问较慢,但是kubeadm又必须要官方镜像,直接把阿里云的对应镜像拉下来改名,就可以把k8s骗过去了。

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.22.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.22.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.22.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.22.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.0-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5

镜像改名,将aliyun下载下来的所有镜像打成k8s.gcr.io/kube-controller-manager:v1.22.0类似tag

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.22.0 k8s.gcr.io/kube-controller-manager:v1.22.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.22.0 k8s.gcr.io/kube-proxy:v1.22.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.22.0 k8s.gcr.io/kube-apiserver:v1.22.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.22.0 k8s.gcr.io/kube-scheduler:v1.22.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.4 k8s.gcr.io/coredns/coredns:v1.8.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.0-0 k8s.gcr.io/etcd:3.5.0-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5 k8s.gcr.io/pause:3.5	

卸磨杀驴,删除阿里云原始镜像

docker rmi -f `docker images --format {{.Repository}}:{{.Tag}} | grep aliyun`

在三台主机的hosts文件中都添加上域名解析,此外还需要关闭防火墙,selinux,时间同步,关闭swap分区(swap可能会误杀pod,k8s在swap开启时无法启动),相关不再赘述

配置k8s的源,官方的源国内访问不了,配成阿里的

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装各种相关软件

# yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git iproute lrzsz bash-completion tree bridge-utils unzip bind-utils gcc
# yum install -y kubelet-1.22.0-0.x86_64 kubeadm-1.22.0-0.x86_64 kubectl-1.22.0-0.x86_64

加载ipvs相关内核模块,配置转发参数

# cat <<EOF > /etc/modules-load.d/ipvs.conf 
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
# cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

重启系统,查看ipvs是否加成功

kubelet 使用 Linux 的 cgroup机制来限制和控制容器的资源使用,也要对其进行配置,配置完成后启动

# cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --pod-infra-container-image=k8s.gcr.io/pause:3.5"
EOF
# systemctl daemon-reload
# systemctl enable kubelet && systemctl restart kubelet

集群初始化,这是在主节点上运行,运行完成后会在输出中找到子节点加入集群的命令,还有需要创建.kube的命令,将其提前保存

[root@kub-k8s-master]# kubeadm init --kubernetes-version=v1.22.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.169.10

接着配置calico网络插件,用于节点间互相通信,下载calico官方的yml文件,运行后就会把改过名的calico包部署下来

curl -L https://docs.projectcalico.org/v3.22/manifests/calico.yaml -O
kubectl apply -f  calico.yaml

部署完成,查看所有pod结果为

在node上运行之前主节点得到的加入命令,完成后查看node状态

k8s本地集群搭建完成(ROLES显示为<none>是指它不是主节点)

遇到问题:部署calico时,一直显示0/1,在网上找了一圈资料,原因是网卡较多选择错误,需要执行“kubectl edit daemonset calico-node -n kube-system”这条命令更改参数,直接指定本机的网卡名

然后“kubectl delete -f calico.yaml”后再重新加载一下calico插件就1/1了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注