kubernetes平台部署集群,超详细!
Kubernetes平台部署集群
一、为什么会出现kubernets?
容器技术(如Docker)在2013年左右开始流行。容器能够轻量化地打包应用程序及其依赖项,保证跨环境的一致性运行。相比传统的虚拟机,容器启动速度快、资源占用小,成为软件开发和部署的理想工具。然而,管理大量容器的复杂性也随之增加,尤其是在生产环境中。企业需要一种能够自动化调度、管理和扩展容器的解决方案。当Docker解决了应用打包的问题后,PaaS上应用大规模部署与管理的问题愈发突出。此时,业内明白:容器本身没有“价值”,有价值的是容器编排。容器编排对Docker及容器进行更高级更灵活的管理,按照用户的意愿和整个系统的规则,完全自动化的处理好容器之间的各种关系。容器技术做为底层基础技术,只能用来创建和启动容器的小工具,用户最终部署的还是他们的网站、服务、数据库,甚至是云计算业务。这就需要一个真正的PaaS平台,让用户把自己的容器应用部署在此之上。
传统的单体架构难以适应复杂、快速变化的业务需求,微服务架构因此变得流行。微服务架构将应用程序拆分为多个独立的服务,每个服务可以独立开发、部署和扩展。容器技术非常适合微服务的部署需求,但随着服务数量的增加,如何协调、监控和管理多个微服务实例变得非常具有挑战性。
在大规模容器化环境中,手动管理和运维工作非常复杂且容易出错。例如:应用需要运行在数百甚至数千个容器上,如何保证资源的合理分配和利用?当某个容器或服务失效时,如何自动恢复服务?如何确保在更新应用时不中断现有服务? 传统的手工方式已经无法高效解决这些问题,因此自动化容器编排工具成为必需。
二、环境准备(三个节点都设置)
2.1节点规划
|
节点 |
IP |
部署项目 |
|
master |
192.168.13.77 |
docker,kubectl,kubeadm,kubelet |
|
node1 |
192.168.13.88 |
docker,kubectl,kubeadm,kubelet |
|
node2 |
192.168.13.99 |
docker,kubectl,kubeadm,kubelet |
2.2修改主机名
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# hostnamectl set-hostname node2
2.3关闭防火墙
[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0
[root@master ~]# getenforce 0
[root@master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
2.3禁用swap分区
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,所以kubernetes要求每个节点都要禁用swap设备
[root@master ~]# vi /etc/fstab

临时修改
[root@master ~]# swapoff -a
2.4修改linux的内核参数
创建并编辑文件:
[root@master ~]# cat /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

保存配置文件后,重新加载配置:
[root@master ~]# sysctl -p
net.ipv4.ip_forward = 1
加载网桥过滤模块:
[root@master ~]# modprobe br_netfilter
查看后台网桥过滤模块是否启动成功
[root@master ~]# lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter

[root@master ~]# sysctl --system
![]()
2.5设置时间同步
[root@localhost ~]# yum install -y ntpdate
[root@localhost ~]# ntpdate time.windows.com
![]()
2.6添加映射文件
[root@master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.13.77 master
192.168.13.88 node1
192.168.13.99 node2

2.7配置ipvs功能
[root@node1 ~]# yum -y install ipvsadm
[root@master ~]# cat /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

[root@master ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
重启linux系统
[root@master ~]# reboot
三、安装docker和k8s(三节点都设置)
3.1安装docker
3.1.1安装docker
[root@master~]#yum install -y wget && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
3.1.2安装docker-ce
[root@master ~]# yum install -y docker-ce-18.06.1.ce-3.el7
![]()
3.1.3启动docker并设开机自启
[root@node1 ~]# systemctl start docker
[root@node1 ~]# systemctl enable docker
![]()
3.1.4查看docker版本
[root@master ~]# docker --version
Docker version 18.06.1-ce, build e68fc7a

3.2配置docker的镜像规则
3.2.1安装docker-ce之后,创建daemon.json文件
[root@node1 ~]# mkdir /etc/docker/
[root@node1 ~]# vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}

3.2.2重新启动docker
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
![]()
3.3配置软件源
3.3.1添加kubernetes国内的yum源
[root@master ~]# cat /etc/yum.repos.d/kubernetes.repo
[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

3.3.2安装kubelet、kubeadm、kubectl
[root@master ~]# yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
3.3.3给kubelet设置开机自启
[root@master ~]# systemctl enable kubelet
![]()
[root@node1 ~]# systemctl is-enabled kubelet
enabled

四、部署master
4.1初始化kubeadm
[root@master ~]# kubeadm init --apiserver-advertise-address=192.168.13.77 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16


4.2创建必要文件:
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

4.3查看节点
[root@master ~]# kubectl get nodes
![]()
4.4把node节点加到k8s集群中
[root@node1 ~]# kubeadm join 192.168.13.77:6443 --token eu465k.7c354zqjeuskzb02 --discovery-token-ca-cert-hash sha256:f27a82affd9374ef94f581e945fe1b46ac2fc12b19ab892f8239f107ee615122
[root@node2 ~]# kubeadm join 192.168.13.77:6443 --token eu465k.7c354zqjeuskzb02 --discovery-token-ca-cert-hash sha256:f27a82affd9374ef94f581e945fe1b46ac2fc12b19ab892f8239f107ee615122


4.5再次查看节点
[root@master ~]# kubectl get nodes

如果token忘记,可以使用这个命令去重新查看一下,只有24小时内有效
[root@master ~]# kubeadm token create --print-join-command

五、部署CNI网络插件calico(三个节点都需要)
虽然现在的k8s集群已经有1个master节点,2个node节点,但是它们的状态都是NotReady的,原因是没有CNI网络插件,为了节点间的通信,需要安装cni的网络插件,常用的cni网络插件有calico和flannel,但是两者的区别为:flannel不支持复杂的网络策略,calico支持网络策略,所以选用calico作为cni的网络插件。
5.1下载calico.yaml文件
进入官网去下载calico.yaml文件
https://docs.tigera.io/archive/v3.18/getting-started/kubernetes/self-managed-onprem/onpremises

插件链接下载的时候是根据k8s版本选择对应的calico版本

[root@master ~]# curl https://docs.projectcalico.org/archive/v3.18/manifests/calico-typha.yaml -o calico.yaml

[root@node1 ~]# curl https://docs.projectcalico.org/archive/v3.18/manifests/calico-typha.yaml -o calico.yaml

[root@node2 ~]# curl https://docs.projectcalico.org/archive/v3.18/manifests/calico-typha.yaml -o calico.yaml

[root@master ~]# ls
![]()
5.2查看镜像
[root@master ~]# grep image calico.yaml

5.3拉取所需镜像(三个节点都需)
[root@master ~]# docker pull docker.io/calico/cni:v3.18.6

[root@master ~]# docker pull docker.io/calico/typha:v3.18.6

[root@master ~]# docker pull docker.io/calico/pod2daemon-flexvol:v3.18.6

[root@master ~]# docker pull docker.io/calico/node:v3.18.6

[root@master ~]# docker pull docker.io/calico/kube-controllers:v3.18.6

5.4查看拉取的镜像
[root@master ~]# docker images



当拉取镜像出现网路的问题导致拉取不成功时,前提是有一个节点已经拉取过这个镜像,那么就可以先把这个镜像打包然后导出镜像,在/root下不在容器里了,然后再通过命令密钥传输到另外一个节点上,然后再从另外这个节点的/root目录下的文件导入镜像到容器里。
[root@master ~]# docker save -o cni.tar calico/cni:v3.18.6
[root@master ~]# ll

[root@node2 ~]# docker load -i cni.tar
![]()
5.5应用calico.yml文件,更新
[root@master ~]# kubectl apply -f calico.yaml

5.6查看节点,成功ready
[root@master ~]# kubectl get nodes

- 测试k8s集群(仅master即可)
6.1在k8s集群中创建一个pod,验证是否正常运行
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
![]()
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
![]()
6.2查看容器状态
[root@master ~]# kubectl get pod,svc

解析:
- CLUSTER-IP:Service在集群内部的虚拟IP地址,用于内部通信。
- EXTERNAL-IP:Service的外部可访问IP地址,这里为空,因为nginx service没有配置外部访问。
- PORT(S):Service监听的端口和可能的节点端口。对于kubernetes Service,它监听的443/TCP端口。对于nginx Service,它将端口80映射到节点上的32338端口上。
- AGE:Service创建的时间,kubernetes Service运行了的时间。
6.3使用http://ip(各节点):(映射端口号)查看节点
master节点:
http://192.168.13.77:32338

node1节点:
http://192.168.13.88:32338

node2节点:
http://192.168.13.99:32338

更多推荐
所有评论(0)