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

解析:

  1. CLUSTER-IP:Service在集群内部的虚拟IP地址,用于内部通信。
  2. EXTERNAL-IP:Service的外部可访问IP地址,这里为空,因为nginx service没有配置外部访问。
  3. PORT(S):Service监听的端口和可能的节点端口。对于kubernetes Service,它监听的443/TCP端口。对于nginx Service,它将端口80映射到节点上的32338端口上。
  4. 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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐