Kubernetes 组件介绍,k8s国内版集群搭建

容器化部署的好处:之前采用普通方式部署项目,做不到互相隔离,若一个项目内存泄露,会导致服务器不可用,而docker容器化管理避免了这种情况,k8s相当于对docker容器化管理的生态将所有容器编排起来,对容器服务自动管理

主要功能:

服务器发现与负载均衡

存储编排(当服务申请内存由k8s管理,当服务器不用后,会自动清理)

自动部署和回滚、自动装箱计算:若应用出现问题回滚到上一个版本,控制每个应用占的内存、cpu大小

自我修复:可以监控到服务器里的应用,若一台服务器挂到后,会自动放到其他机器上

Kubernetes 组件介绍

  • 一个 kubernetes 集群主要由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。

  • 控制节点(master):集群的控制平面,负责集群的决策。

    • API Server:集群操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制。

    • Scheduler:负责集群资源调度,按照预定的调度策略将 Pod 调度到相应的 node 节点上。

    • ControllerManager:负责维护集群的状态,比如程序部署安排、故障检测、自动扩展和滚动更新等。

    • Etcd:负责存储集群中各种资源对象的信息。

  • 工作节点(node):集群的数据平面,负责为容器提供运行环境。

    • Kubelet:负责维护容器的生命周期,即通过控制 Docker ,来创建、更新、销毁容器。

    • KubeProxy:负责提供集群内部的服务发现和负载均衡。

    • Docker:负责节点上容器的各种操作。

组件工作流程

  • 以部署一个 Nginx 服务来说明 Kubernetes 系统各个组件调用关系:

  • ① 首先需要明确,一旦 Kubernetes 环境启动之后,master 和 node 都会将自身的信息存储到etcd数据库中。

  • ② 一个Nginx服务的安装请求首先会被发送到 master 节点上的 API Server 组件。

  • ③ API Server 组件会调用 Scheduler 组件来决定到底应该把这个服务安装到那个 node 节点上。此时,它会从 etcd 中读取各个 node 节点的信息,然后按照一定的算法进行选择,并将结果告知 API Server 。

  • ④ API Server 调用 Controller-Manager 去调用 Node 节点安装 Nginx 服务。

  • ⑤ Kubelet 接收到指令后,会通知 Docker ,然后由 Docker 来启动一个 Nginx 的 Pod 。Pod 是 Kubernetes 的最小操作单元,容器必须跑在 Pod 中。

  • ⑥ 一个 Nginx 服务就运行了,如果需要访问 Nginx ,就需要通过 kube-proxy 来对 Pod 产生访问的代理,这样,外界用户就可以访问集群中的 Nginx 服务了

其他节点

  • Master:集群控制节点,每个集群要求至少有一个 Master 节点来负责集群的管控。

  • Node:工作负载节点,由 Master 分配容器到这些 Node 工作节点上,然后 Node 节点上的 Docker 负责容器的运行。

  • Pod:Kubernetes 的最小控制单元,容器都是运行在 Pod 中的,一个 Pod 中可以有一个或多个容器。

  • Controller:控制器,通过它来实现对 Pod 的管理,比如启动 Pod 、停止 Pod 、伸缩 Pod 的数量等等。

  • Service:Pod 对外服务的统一入口,其下面可以维护同一类的多个 Pod 。

  • Label:标签,用于对 Pod 进行分类,同一类 Pod 会拥有相同的标签。

  • NameSpace:命名空间,用来隔离 Pod 的运行环境。

集群环境的搭建

查看虚拟机版本,最好是7.5以上的

cat /etc/redhat-release 

配置主机名解析,方便引用

vim /etc/hosts

加入解析
192.168.6.100 master
192.168.6.101 node1
192.168.6.102 node2

ping看能不能ping通

时间同步:kubernetes要求集群中的节点时间必须精确一致,所以在每个节点上添加时间同步

systemctl start chronyd
systemctl enable chronyd  #开机自启
date                      #查看时间

docker启动会产生iptables规则,防止系统混淆需要关闭,系统没自带则不用处理

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
#关闭iptables服务
systemctl stop iptables
systemctl disable iptables
#禁用Linux安全服务 查看selinux是否开启
getenforce
#永久关闭selinux,需要重启
vim /etc/selinux/config 
SELINUX=disabled
#临时关闭selinux,重启之后,无效
setenforce 0

关闭swap分区:虚拟内存分区,物理内存使用完后,将磁盘开机当虚拟内存使用

vim /etc/fstab 
#注释掉最后一行
#/dev/mapper/centos-swap swap                    swap    defaults

修改Linux内核参数,创建配置文件

vim /etc/sysctl.d/kubernetes.conf

#桥接的IPv4流量传递到iptables的链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

重新加载配置

sysctl -p

加载网桥过滤模块

modprobe br_netfilter

 查看是否加载

lsmod | grep br_netfilter

配置ipvs功能

在k8s中service有两种代理模型,一种是iptables一种是ipvs的,ipvs性能较高一些

手动载入ipvs模块

yum -y install ipset ipvsadm

添加对应的脚本文件,编写对应内容

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

添加执行权限

chmod +x /etc/sysconfig/modules/ipvs.modules

执行文件,载入模块

/bin/bash /etc/sysconfig/modules/ipvs.modules

检查是否成功

lsmod | grep -e ipvs -e nf_conntrack_ipv4

此时环境配置好了,重启     reboot

每个节点安装Docker、kubeadm、kubelet和kubectl

安装docker

#切换镜像
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#安装
yum -y install docker-ce-18.06.3.ce-3.el7

添加配置文件,docker默认使用cgroupfs,k8s推荐使用systemd

mkdir /etc/docker
vim daemon.json 
#输入以下内容
{
  "exec-opts":["native.cgroupdriver=systemd"],
  "registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]
}

卸载docker

yum list installed|grep docker   查看docker安装列表
yum -y remove xxx                 卸载查出来的名称即可
systemctl enable docker          自启

安装k8s组件

切换镜像源

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

安装

yum install -y --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0  -y
卸载
rpm -e kubelet-1.18.0 kubelet-1.18.0 kubelet-1.18.0 --nodeps

为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,"/etc/sysconfig/kubelet"文件的内容

# 改为
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

开机自启

systemctl enable kubelet

集群配置

因为k8s是国外网站,下载需要配置镜像,指定下载版本

查看所需镜像

kubeadm config images list

指定固定版本

images=(
    kube-apiserver:v1.17.4
    kube-controller-manager:v1.17.4
    kube-scheduler:v1.17.4
    kube-proxy:v1.17.4
    pause:3.1
    etcd:3.4.3-0
    coredns:1.6.5
)

循环遍历下载

for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

查看镜像有没有下成功 docker images

只部署k8s的Master节点

kubeadm init \
  --kubernetes-version v1.17.4 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=192.168.6.100

命令行会提示

To start using your cluster, you need to run the following as a regular user:

  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.6.101:6443 --token sv5epz.4f8hvj7ukjlrv857 \
    --discovery-token-ca-cert-hash sha256:56bc77d7c4c95cc7aca777185e14274e4f99bc8d3b21da65d89ff19987e83554 

接着输入

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

在其他服务器上输入

kubeadm join 192.168.6.101:6443 --token sv5epz.4f8hvj7ukjlrv857 \
    --discovery-token-ca-cert-hash sha256:56bc77d7c4c95cc7aca777185e14274e4f99bc8d3b21da65d89ff19987e83554 

查看节点

kubectl get nodes

接着输入后node节点没连接上,查了下原因说是node节点不能自启,需要把master节点的/etc/kubernetes/admin.conf文件复制到node节点的服务器上

安装网络插件,在master节点

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

使用配置文件启动flannel

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看部署CNI网络插件进度:

kubectl get pods -n kube-system

查看集群健康状况:

kubectl get cs

猜你喜欢

转载自blog.csdn.net/weixin_52210557/article/details/123618568