Kubernetes - Kubernetes详解;安装部署

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes - Kubernetes详解;安装部署相关的知识,希望对你有一定的参考价值。

一、Kubernetes

Kubernetes 这个单词源于希腊语,意为“舵手”或“飞行员”。

Kubernetes,也称为K8S,其中8是代表中间“ubernete”的8个字符,是Google在2014年开源的一个容器编排引擎,作为CNCF(Cloud Native Computing Foundation;云原生计算基金会)最重要的组件之一

Kubernetes用于自动化容器化应用程序的部署、规划、扩展和管理,它将组成应用程序的容器分组为逻辑单元,以便于管理和发现,用于管理云平台中多个主机上的容器化的应用

Kubernetes 的目标是让部署容器化的应用简单并且高效,很多细节都不需要运维人员去进行复杂的手工配置和处理

Kubernetes官网
Kubernetes  

GitHub地址:

GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management

Kubernetes中文文档:

Kubernetes 是什么? | Kubernetes

Kubernetes是采用Go语言(Go语言是谷歌2009发布的一款开源编程语言)开发

二、Kubernetes 架构

(一)Master

k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求

Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 组成

1、集群API:kube-apiserver

kube-apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。

当需要与 Kubernetes 集群进行交互时,就要通过 API。 Kubernetes API是 Kubernetes Control Plane的前端,用于处理内部和外部请求。API 服务器会确定请求是否有效,如果有效,则对其进行处理。用户通过 REST 调用、kubectl 命令行界面或其他命令行工具(例如 kubeadm)来访问 API。

2、集群调度:kube-scheduler

kube-scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上

调度程序会考虑容器集的资源需求(例如 CPU 或内存)以及集群的运行状况。随后,它会将容器集安排到适当的计算节点。

3、集群控制器:kube-controller-manager

kube-controller-manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等

控制器负责实际运行集群,而 Kubernetes 控制器管理器则是将多个控制器功能合而为一。控制器用于查询调度程序,并确保有正确数量的容器集在运行。如果有容器集停止运行,另一个控制器会发现并做出响应。控制器会将服务连接至容器集,以便让请求前往正确的端点。还有一些控制器用于创建帐户和 API 访问令牌。

4、键值存储数据库:etcd

etcd保存了整个集群的状态

应用的配置数据以及有关集群状态的信息位于etcd(k-v数据库)中。etcd 采用分布式、容错设计,被视为集群的最终事实来源

(二)Nodes

集群工作节点,运行用户业务应用容器

Nodes节点也叫Worker Node,包含kubelet、kube proxy 和 Pod(Container Runtime)

1、Pod

Pod是 Kubernetes 对象模型中最小、最简单的单元

它代表了应用的单个实例。每个Pod都由一个容器(或一系列紧密耦合的容器)以及若干控制容器运行方式的选件组成。Pod可以连接至持久存储,以运行有状态应用

2、Container Runtime Engine

Container runtime负责镜像管理以及Pod和容器的真正运行(CRI)

为了运行容器,每个Node都有一个容器运行时引擎。比如Docker,但 Kubernetes 也支持其他符合开源容器运动(OCI)标准的容器,例如 rkt 和 CRI-O。Kubernetes支持实现了CRI接口的其他大多数的容器

3、kubelet

kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理

每个计算节点中都包含一个 kubelet,这是一个与Control Plane通信的微型应用。kublet 可确保容器在Pod内运行。当Control Plane需要在节点中执行某个操作时,kubelet 就会执行该操作

4、kube-proxy

kube-proxy负责为Service提供cluster内部的服务发现和负载均衡

每个计算节点中还包含 kube-proxy,这是一个用于优化 Kubernetes 网络服务的网络代理。kube-proxy 负责处理集群内部或外部的网络通信(靠操作系统的数据包过滤层,或者自行转发流量)

三、Kubeadm部署Kubernetes

(一)Kubernetes环境搭建方式

1、minikube

minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便可以试用Kubernetes或进行日常开发工作

Hello Minikube | Kubernetes

2、kind

Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker

kind

3、kubeadm

Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;

官方地址:

Kubeadm | Kubernetes

Installing kubeadm | Kubernetes

安装 kubeadm | Kubernetes

4、二进制包

从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是可以对各个组件有更清晰的认识

5、yum安装

通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老,所以这种方式用得也比较少了

 6、第三方工具

有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;

 7、花钱购买

直接购买类似阿里云这样的公有云平台k8s

(二)Kubeadm部署Kubernetes

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

 1、创建一个Master节点:kubeadm init

 2、将Node节点加入到Master集群中: kubeadm join <Master节点的IP和端口>

(三)Kubernetes部署环境要求

(1)一台或多台机器,操作系统CentOS 7.x-86_x64

(2)硬件配置:内存2GB或2G+,CPU 2核或CPU 2核+

(3)集群内各个机器之间能相互通信

(4)禁止swap分区

(5)集群内各个机器可以访问外网,需要拉取镜像

如果环境不满足要求,会报错如下

  

(四)Kubernetes部署环境准备

1、关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

2、 关闭selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config  #永久
setenforce 0  #临时

3、 关闭swap(k8s禁止虚拟内存以提高性能)

sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
swapoff -a #临时

4、 在master添加hosts

cat >> /etc/hosts << EOF
192.168.132.129 k8smaster
192.168.132.130 k8snode
EOF

5、设置网桥参数

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  #生效

6、同步时间

yum install ntpdate -y    #如果没有ntpdate命令先安装
ntpdate time.windows.com

(五)Kubernetes安装具体步骤

1、安装 Docker

所有服务器节点安装 Docker/kubeadm/kubelet/kubectl

Kubernetes 默认容器运行环境是Docker,因此首先需要安装Docker

我们可以按照下述方式安装指定版本Docker 

//更新docker的yum源
yum install wget -y
 
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
 
//安装指定版本的docker:
yum install docker-ce-20.10.0 -y

安装、卸载可参考官网最新文档

Install Docker Engine on CentOS | Docker Documentation

Docker版本说明

Docker Engine release notes | Docker Documentation

配置加速器加速下载

/etc/docker/daemon.json  如果此文件不存在,先创建


    # 阿里云镜像加速器;可自己注册复制过来
    "registry-mirrors": ["https://registry.docker-cn.com"]

  

执行 

systemctl enable docker.service

 搭建:kubeadm、kubelet、kubectl

Kubelet

运行在cluster所有节点上,负责启动POD和容器

Kubeadm:

用于初始化cluster的一个工具

Kubectl:

kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件

2、 添加k8s的阿里云YUM源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF

3、安装 kubeadm,kubelet 和 kubectl

Kubernetes版本如下

补丁版本 | Kubernetes

yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y

查看是否安装:

yum list installed | grep kubelet

yum list installed | grep kubeadm

yum list installed | grep kubectl

查看安装的版本:

kubeadm version
kubectl version --client
kubelet --version

安装完成后执行

systemctl enable kubelet.service

重启CentOS: reboot 

Linux centos重启命令:

1、reboot 普通重启

2、shutdown -r now 立刻重启(root用户使用)

3、shutdown -r 10 过10分钟自动重启(root用户使用)

4、shutdown -r 10:30 在时间为10:30重启(root用户使用)

4、部署Kubernetes Master主节点 

(2)在master机器上执行

kubeadm init 
    --apiserver-advertise-address=192.168.133.129 
    --control-plane-endpoint=master
    --image-repository registry.aliyuncs.com/google_containers 
    --kubernetes-version v1.19.4 
    --service-cidr=10.96.0.0/12 
    --pod-network-cidr=10.244.0.0/16

参数说明:

        --apiserver-advertise-address 集群通告地址,主节点id

        --control-plane-endpoint 主节点的主机名

        --image-repository  由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址

        --kubernetes-version K8s版本,与上面安装的一致

        --service-cidr 集群内部虚拟网络,Pod统一访问入口

        --pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一

注:

service-cidr 的选取不能和PodCIDR及本机网络有重叠或者冲突,一般可以选择一个本机网络和PodCIDR都没有用到的私网地址段,比如PODCIDR使用10.244.0.0/16, 那么service cidr可以选择10.96.0.0/12,网络无重叠冲突即可 

执行报错

重启一下centos,然后再执行上面的 kubeadm init 命令

试了一下,重启centos还是会报同样的错误仔细排查;“kube-apiserver.yaml,kube-controller-manager.yaml,kube-scheduler.yaml,etcd.yaml” 这几个yaml文件已经存在了,只要重置一下即可

kubeadm reset
mv /etc/containerd/config.toml /tmp/
systemctl restart containerd

然后重新输入上述的 kubeadm init 命令,会拿到如下输出,粘贴最后一段
kubeadm join IP:PORT --token XX \\
    --discovery-token-ca-cert-hash sha256:XX 

备用(集群添加新节点,执行的命令就是kubeadm init最后输出的kubeadm join命令)

kubeadm join 192.168.133.129:6443 --token vx912w.g8wyei3zo8qem1mq \\
    --discovery-token-ca-cert-hash sha256:5c08ca34fed1e3fcef41e581970d3046ac85db10ee4a3875efb0bca5c8f8b104

上图中1 表示 初始化成功

2 表示 集群还需要的操作

3 表示 添加节点令牌(24小时有效期,过期再去获取令牌即可)

重新获取令牌

kubeadm token create --print-join-command

(2)在master机器上执行(配置环境变量

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

kubectl get nodes

如果遇到如下报错:

sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin

因为 /etc/sudoers 文件只读,所以sudo chmod 777 /etc/sudoers ,结果可以修改这个文件了,但是导致所有用户的sudo都不能用了

我们可以输入命令修改sudoers的权限:

chmod 0440 /etc/sudoers 
reboot

再输入 reboot重启即可

 kubectl get nodes

5、把node节点加入Kubernetes master中,在Node机器上执行

向集群添加新节点,执行的命令就是kubeadm init最后输出的kubeadm join命令

kubeadm join 192.168.133.129:6443 --token vx912w.g8wyei3zo8qem1mq \\
    --discovery-token-ca-cert-hash sha256:5c08ca34fed1e3fcef41e581970d3046ac85db10ee4a3875efb0bca5c8f8b104

 kubectl get nodes 

(六)部署网络插件(master主节点机器运行)

1、下载kube-flannel.yml文件

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

2、应用kube-flannel.yml文件得到运行时容器

kubectl apply -f kube-flannel.yml

3、查看节点状态: kubectl get nodes

不会立即就绪,需要等一会儿,节点才会就绪

检查状态是否成功 

kubectl get cs
kubectl cluster-info

查看运行时容器pod(一个pod里面运行了多个docker容器)

kubectl get pods -n kube-system

到这里,我们的k8s环境搭建OK !!!

四、Kubernetes部署“容器化应用”(测试kubernetes集群

在集群中创建一个pod,验证是否正常运行

1、在Kubernetes集群中部署一个Nginx

1、在网上拉取一个nginx镜像

kubectl create deployment nginx --image=nginx

2、对外暴露一个80端口

kubectl expose deployment nginx --port=80 --type=NodePort

3、查看对外端口

kubectl get pod,svc

4、访问地址:http://NodeIP:Port

 2、在Kubernetes集群中部署一个Tomcat

kubectl create deployment tomcat --image=tomcat

kubectl expose deployment tomcat --port=8080 --type=NodePort

kubectl get pod,svc

访问地址:http://NodeIP:Port

以上是关于Kubernetes - Kubernetes详解;安装部署的主要内容,如果未能解决你的问题,请参考以下文章

详解kubernetes(k8s)安装及常见坑

Kubernetes 探针详解!

Kubernetes - Kubernetes详解;安装部署

kubernetes-整体概述和架构详解

kubernetes资源管理详解

Kubernetes 故障转移和自愈能力机制详解