K8s–集群搭建

  • Post author:
  • Post category:其他




一、环境


1、 前置知识点
	
目前生产部署Kubernetes 集群主要有两种方式:

kubeadm:
			Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。
			官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

二进制包:

		从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。



	Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,
	虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。


------------------------------		我这里是使用Kubeadm来构建Kubernetes 集群		---------------------------------------------


kubeadm 部署方式介绍:
kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:

		1、创建一个Master 节点kubeadm init
		2、将Node 节点加入到当前集群中$ kubeadm join <Master 节点的IP 和端口>


2、虚拟机准备:
	三台虚拟机,master node01 node02
	操作系统CentOS7.5
	安装选	基础服务器安装  (这样一些基础软件就会自动安装,如 chrony软件)
	可以访问外网,需要拉取镜像(yum源最好换成国内的,如 阿里源)



二、系统初始化


1、 设置系统主机名:

hostnamectl set-hostname master
hostnamectl set-hostname node01
hostnamectl set-hostname node02


2、设置主机解析:

cat <<EOF>> /etc/hosts
192.168.200.201 master
192.168.200.202 node01
192.168.200.203 node02
EOF

3.关闭和禁用防火墙、selinux

systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config



4、关闭swap和禁用swap(提升系统的性能)

swapoff -a && sed -i 's/^.*centos-swap/#&/g' /etc/fstab



5、模块设置和内核参数

# 激活 br_netfilter 模块(加载网桥过滤模块)
modprobe br_netfilter


# 内核参数设置:开启IP转发,允许iptables对bridge的数据进行处理(添加网桥过滤和地址转发功能)
cat << EOF > /etc/sysctl.d/k8s.conf 
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# 立即生效
sysctl --system


6、集群时间同步(K8s集群中的节点时间必须一致,这里直接使用chronyd服务从网络同步时间):

systemctl start chronyd && systemctl enable chronyd





三、安装docker


yum install -y yum-utils device-mapper-persistent-data lvm2		#安装辅助软件包


yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo		#设置阿里云docker镜像地址为存储库(官方镜像地址是国外网,比较慢)

yum install -y docker-ce-19.03.13	#安装docker社区版(指明版本,不安装阿里源上的最新版,避免出现兼容性问题)

systemctl enable docker && systemctl start docker 




 配置 docker 的镜像加速器、cgroup 驱动及存储驱动程序。

cat << EOF > /etc/docker/daemon.json
{
  "registry-mirrors": ["去阿里云上找自己的镜像加速器网址"],			参考:https://blog.csdn.net/qq_52807660/article/details/121174340
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

systemctl daemon-reload
systemctl restart docker


 Kubernetes 推荐使用 systemd 来代替 cgroupfs。因为 docker 容器默认 cgroup 驱动为 cgroupfs,而 kubelet 默认为 systemd,
 所以为了使系统更为稳定,容器和 kubelet 应该都使用 systemd 作为 cgroup 驱动。



四、安装 kubeadm


配置K8s的yum源:
不过由于官方源位于国外,可能无法访问或者速度超慢,可以使用国内的 yum 源像阿里源、清华大学源等。

这里使用阿里源:

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 kubelet-1.18.1 kubeadm-1.18.1 kubectl-1.18.1				#安装K8s集群软件包(指明版本,不安装阿里源上的最新版,避免出现兼容性问题)


systemctl enable kubelet && systemctl start kubelet




---------------------------------	以上操作,在master node01 node02 都操作	--------------------------------------




五、部署Kubernetes(master节点操作)



[root@master ~]# kubeadm init --apiserver-advertise-address=192.168.200.201 --image-repository=registry.aliyuncs.com/google_containers  --kubernetes-version=v1.18.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16

选项说明:
  --apiserver-advertise-address:主节点的 IP 地址
  --image-repository:选择用于拉取镜像的镜像仓库,这里配置为阿里云的镜像仓库
  --kubernetes-version:安装的k8s版本
  --service-cidr:为服务的VIP指定使用的IP地址范围(默认为“10.96.0.0/12”)
  --pod-network-cidr:指定Pod网络的IP地址范围。如果设置,则将自动为每个节点分配CIDR。
  
注:
  因为后面要部署 flannel,参照flannel文档,我们要指定Pod网络的IP地址范围为10.244.0.0/16


下面是部分输出内容,可以看到初始化成功的信息和一些提示。

............................
............................
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!							#表明Kubernetes控制平面已成功初始化!

To start using your cluster, you need to run the following as a regular user:		#要开始使用集群,要在master节点先运行这三句命令

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

You should now deploy a pod network to the cluster.									#怎样创建网络
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

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

kubeadm join 192.168.200.201:6443 --token 7fzqs6.qpnqzss6kpuis00b \
    --discovery-token-ca-cert-hash sha256:a2233758942ce550d48421bc943b8e3b5e7f504f8c0419a47e22c83040c70721 					
					#想要把那个节点加入K8s集群,就在那个节点上运行这句命令



创建必要文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config


把node01 和 node02 加入K8s集群后的状态是这样的:
[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES    AGE     VERSION
master   NotReady   master   2m53s   v1.18.1
node01   NotReady   <none>   9s      v1.18.1
node02   NotReady   <none>   4s      v1.18.1

此时的状态并没有集群成功,需要安装第三方网络插件



六、安装网络插件(master节点操作)


K8s支持多种网络插件,比如flannel、calico、canal等等,任选一种即可,本次选择flannel

# 安装网络插件
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml


# 查看flannel状态(可能要等个30秒,flannel状态才能运行)
[root@master ~]# kubectl get pods -A | grep flannel
kube-system   kube-flannel-ds-lxvdp            1/1     Running   0          5h49m
kube-system   kube-flannel-ds-p2jfl            1/1     Running   0          5h49m
kube-system   kube-flannel-ds-snb5n            1/1     Running   0          5h49m


[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   5m31s   v1.18.1
node01   Ready    <none>   2m47s   v1.18.1
node02   Ready    <none>   2m42s   v1.18.1



集群成功!!!



七、测试kubernetes 集群(master节点操作)

[root@master ~]# kubectl create deployment nginx --image=nginx				部署nginx服务集群
deployment.apps/nginx created		
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort			开放80端口
service/nginx exposed
[root@master ~]# kubectl get pod,svc
NAME                        READY   STATUS              RESTARTS   AGE
pod/nginx-f89759699-2rb8x   0/1     ContainerCreating   0          17s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        6m36s
service/nginx        NodePort    10.98.48.54   <none>        80:32341/TCP   8s
[root@master ~]# curl localhost:32341					本地访问
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>



kubernetes 集群  可用!!!!

在这里插入图片描述



版权声明:本文为qq_52807660原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。