于2021年
简介
https://zhuanlan.zhihu.com/p/712951342
Kubernetes集群组件
特定接口CRI、CNI、CSI
Kubernetes组件说明
master节点:提供控制功能
- etcd 一个高可用的K/V键值对存储和服务发现系统
- flannel 实现跨主机的容器网络的通信
- kube-apiserver 提供kubernetes集群的API调用
- kube-controller-manager 控制器,网络控制器、卷控制器、服务控制器、node控制器等,来管理各种资源。
- kube-scheduler 调度容器,把k8s的各种工作分配到node节点;
node节点:提供工作能力,来执行实际的工作任务
-
kubelet 在Node节点上按照配置文件中定义的容器规格启动容器。作为连接master和node间的桥梁,接受来自master的下发任务,负责维护pod和容器的生命周期。
-
kube-proxy 提供网络代理服务,将service与pod打通。实现pod网络代理,是service的透明代理兼四层负载均衡功能,核心能力将service的访问请求转发到后端多个pod实例上。
特定接口CRI、CNI、CSI
Kubernetes提供了三个特定功能的接口,kubernetes通过调用这几个接口,来完成相应的功能。
1. 容器运行时接口CRI: Container Runtime Interface
kubernetes 对于容器的解决方案,只是预留了容器接口,只要符合CRI标准的解决方案都可以使用。CRI容器运行时,早期和主流的是docker,后经生态发展,目前其他的也有多种了,比如containerd,dokcer不再是唯一选择。
补充说明:什么是容器运行时:如下
简单来说,就如是一个程序运行的集合,程序运行都需要一套环境,例如Java要运行,就需要台Jvm,Jvm就提供了Java程序运行的环境;
2. 容器网络接口CNI: Container Network Interface
kubernetes 对于网络的解决方案,只是预留了网络接口,只要符合CNI标准的解决方案都可以使用。CNI容器网络接口:通过跨网络与容器进行通信,依赖于网络插件实现能力,如Flannel、calico。
3. 容器存储接口CSI: Container Storage Interface
kubernetes 对于存储的解决方案,只是预留了存储接口,只要符合CSI标准的解决方案都可以使用此接口非必须。应对不同的存储类型提供接口,让工作节点把数据在某个地方做持久化保存。
补充说明:容器运行时接口(CRI),是kubernetes定义的一组gRPC服务。Kubelet作为客户端,基于gRPC协议通过Socket和容器运行时通信。CRI 是一个插件接口,它使 kubelet 能够使用各种容器运行时,无需重新编译集群组件。Kubernetes 集群中需要在每个节点上都有一个可以正常工作的容器运行时, 这样 kubelet 能启动 Pod 及其容器。容器运行时接口(CRI)是 kubelet 和容器运行时之间通信的主要协议。
CRI包括两类服务:镜像服务(Image Service)和运行时服务(Runtime Service)
镜像服务提供下载、检查和删除镜像的远程程序调用
运行时服务包含用于管理容器生命周期,以及与容器交互的调用的远程程序调用。
OCI(Open Container Initiative,开放容器计划)定义了创建容器的格式和运行时的开源行业标准,包 括镜像规范(Image Specification)和运行时规范(Runtime Specification)。
市面上常用的容器引擎有很多,dockershim, containerd 和cri-o都是遵循CRI的容器运行时
集群创建方案选择
方式1: Docker
Docker使用的普及率较高,虽然Kubernetes-v1.24 默认情况下废弃了kubelet对于Docker的支持,但是我们还可以借助于Mirantis维护的cri-dockerd插件方式来实现Kubernetes集群的创建。
Docker Engine 没有实现 CRI, 而这是容器运行时在 Kubernetes 中工作所需要的。为此,必须安装一个额外的服务 cri-dockerd。 cri-dockerd 是一个基于传统的内置 Docker 引擎支持的项目, 它在 1.24 版本从 kubelet 中移除
方式2: Containerd
默认情况下,Kubernetes在创建集群的时候,使用的就是Containerd 方式。
方式3: CRI-O
CRI-O的方式是Kubernetes创建容器最直接的一种方式,在创建集群的时候,需要借助于cri-o插件的方式来实现Kubernetes集群的创建。
.
.
.
部署
查看版本
在官网上查看最新版本v1.19.0-rc.4
https://github.com/kubernetes/kubernetes/tags
查看操作系统
[root@master~]# cat /etc/redhat-release
CentOS Linux 7.4.1708 (Core)
[root@master~]# cat /proc/version
Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Tue Aug 22 21:09:27 UTC 2017
修改IP地址、主机名和host解析
节点及功能 | 主机名 | IP |
---|---|---|
master、etcd、registry | master | 192.168.11.10 |
node1 | node1 | 192.168.11.11 |
node2 | node2 | 192.168.11.12 |
#查询并修改主机名,重启生效
[root@master~]# hostname
[root@master~]# vi /etc/hostname 或 hostnamectl set-hostname master
master
#修改IP和所有主机名的映射关系(所有机器)
[root@master~]# vi /etc/hosts
192.168.11.10 master
192.168.11.11 node1
192.168.11.12 node2
[root@master ~]# systemctl restart network 或 reboot
虚拟机NAT网络设置
节点上的其他设置
1.1 确保系统已经安装epel-release源
RedHat系列的包管理工具是yum
[root@master ~]# yum -y install epel-release
1.2 关闭三台机器上的防火墙
[root@master ~]# systemctl stop firewalld.service
[root@master ~]# systemctl disable firewalld.service
[root@master ~]# setenforce 0 && sed -i ‘s/^SELINUX=.*/SELINUX=disabled/’ /etc/selinux/config
[root@master ~]# swapoff -a && sed -i ‘/ swap / s/^(.*)$/#\1/g’ /etc/fstab
设置固定的IP地址
[root@master ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
[root@master manifests]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="58fbb6d0-e33a-425e-b863-0681c854bc8b"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.11.10"
NETMASK="255.255.255.0"
GATEWAY="192.168.11.2"
DNS1="8.8.8.8"
DNA2="8.8.4.4"
#dns
[root@node2 rc.d]# cat /etc/resolv.conf
# Generated by NetworkManager
# nameserver 8.8.8.8
# nameserver 8.8.4.4
卸载docker 旧版本
卸载Docker Engine,CLI和Containerd软件包,并删除数据
#主机上的镜像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷。
您必须手动删除所有已编辑的配置文件。
[root@node1 ~]# yum list installed | grep docker
[root@node1 ~]# yum remove docker.x86_64 docker-client.x86_642 docker-common.x86_642
#取消挂载
[root@node1 ~]# umount /var/lib/docker/containers
[root@node1 ~]# umount /var/lib/docker/overlay2
#清空docker产生的文件
[root@node1 ~]# rm -rf /var/lib/docker && rm -rf /etc/docker
安装docker(所有节点)
[root@master ~]# yum install docker -y
3.5 修改docker网络
安装 kubernetes-master
使用 yum 安装 etcd 和 kubernetes-master
查看版本
[root@master hello]# yum list|grep kubernetes
[root@master hello]# yum list installed | grep kubernetes
kubernetes-client.x86_64 1.5.2-0.7.git269f928.el7 @extras
kubernetes-master.x86_64 1.5.2-0.7.git269f928.el7 @extras
安装etcd
[root@master ~]# yum install etcd -y
编辑 etcd 配置文件
[root@master ~]# vim /etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" #etcd节点与客户端通信时所监听的地址列表
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.11.10:2379" #etcd集群通信所监听节点地址和端口
设置开机启动
[root@master ~]# systemctl enable etcd.service
[root@master ~]# systemctl start etcd.service
测试etcd是否安装成功
[root@master ~]# etcdctl set testdir/testkey0 0
0
[root@master ~]# etcdctl get testdir/testkey0
0
检查健康状态
[root@master ~]# etcdctl -C http://192.168.11.10:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.11.10:2379
cluster is healthy
master节点 在etcd中定义flannel网络
Flannel要用etcd存储自身一个子网信息,所以要保证能成功连接Etcd,写入预定义子网段。
##在master节点安装key
[root@master ~]# etcdctl mk /atomic.io/network/config ‘{“Network”:“172.17.0.0/16”}’
{“Network”:“172.17.0.0/16”}
#查看是否添加成功
[root@master ~]# etcdctl get /atomic.io/network/config
{“Network”:“172.17.0.0/16”}
安装kubernetes
[root@master ~]# yum install kubernetes-master -y
编辑 /etc/kubernetes/apiserver 文件
[root@master ~]# vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""
ps:测试时需要把KUBE_ADMISSION_CONTROL中的SecurityContextDeny和ServiceAccount去掉,这是权限相关的
安装 flannel 网络
在所有节点安装并修改flanneld网络相关信息
[root@master ~]# yum install flannel -y
[root@master ~]# sed -i 's#http://127.0.0.1:2379#http://192.168.11.10:2379#g' /etc/sysconfig/flanneld
[root@node-1 ~]# yum install flannel -y
[root@node-1 ~]# ]# sed -i 's#http://127.0.0.1:2379#http://192.168.11.10:2379#g' /etc/sysconfig/flanneld
检查flannel版本
[root@master ~]# yum list |grep flannel
flannel.x86_64 0.7.1-9.el7 @extras
FLANNEL_ETCD:ETCD的地址
FLANNEL_ETCD_KEY:etcd中配置的网络参数的key
FLANNEL_OPTIONS:是flannel的启动参数,在这里可以加上监听的网卡,如–iface=ens33
启动flannel服务
flannel服务启动时主要做了以下几步的工作:
1.从etcd中获取network的配置信息。
2.划分subnet,并在etcd中进行注册。
3.将子网信息记录到/run/flannel/subnet.env中
启动服务
启动etcd、kube-apiserver、kube-controller-manager、kube-scheduler等服务,并设置开机启动。
[root@master ~]# systemctl enable flanneld.service
[root@master ~]# systemctl enable docker
[root@master ~]# systemctl enable kube-apiserver kube-scheduler kube-controller-manager
[root@master ~]# systemctl start kube-apiserver kube-scheduler kube-controller-manager
启动顺序
[root@master ~]# systemctl start etcd
[root@master ~]# systemctl restart flanneld.service
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl restart kube-apiserver.service
[root@master ~]# systemctl restart kube-controller-manager.service
[root@master ~]# systemctl restart kube-scheduler.service
检查是否生效
确保docker0与flannel0在同一网段。
[root@master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e5:0a:47 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.10/24 brd 192.168.11.255 scope global dynamic ens33
valid_lft 1571sec preferred_lft 1571sec
inet6 fe80::20c:29ff:fee5:a47/64 scope link
valid_lft forever preferred_lft forever
3: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN qlen 500
link/none
inet 172.17.63.0/16 scope global flannel0
valid_lft forever preferred_lft forever
inet6 fe80::3ff4:7f41:553b:d583/64 scope link flags 800
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:30:49:69:8f brd ff:ff:ff:ff:ff:ff
inet 172.17.63.1/24 scope global docker0
valid_lft forever preferred_lft forever
查看启动的docker是否被flannel托管:如果有–bip=172.17.45.1/24(xxxx) ,说明Flannel管理了Docker
可以看到docker启动后被加上了flanneld的相关配置项了(bip, ip-masq 和 mtu)
https://blog.csdn.net/yelllowcong/article/details/78303626
[root@master ~]# ps -ef|grep docker 或 ps aux | grep docker
root 1290 1 0 01:05 ? 00:00:59 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2 --bip=172.17.63.1/24 --ip-masq=true --mtu=1472
root 1295 1290 0 01:05 ? 00:00:40 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --runtime-args --systemd-cgroup=true
[root@master ~]# hostname -I
192.168.11.10 172.17.63.0 172.17.63.1
测试不同节点互通,在当前节点访问另一个Node节点docker0 IP
[root@master ~]# ping 172.17.63.1/24
如果能通说明Flannel部署成功。如果不通检查下日志:journalctl -u flannel
因master防火墙端口问题导致启动失败,node错误信息如下
https://blog.csdn.net/wangshuminjava/article/details/89913701
2 node节点 安装
1.使用yum安装 flannel 和 kubernetes-node
[root@master ~]# yum -y install flannel kubernetes-node
kubeconfig文件用于kubelet连接master apiserver
kubelet 配置文件修改
[root@node1 ~]# vi /etc/kubernetes/config
…
KUBE_MASTER=“–master=http://192.168.11.10:8080”
kubelet 核心文件修改
[root@node1 ~]# vi /etc/kubernetes/kubelet
KUBELET_HOSTNAME=“–hostname-override=node1”
KUBELET_API_SERVER=“–api-servers=http://192.168.11.10:8080”
搭建完成
在master节点查看 node状态,如下信息表示环境搭建成功
[root@master ~]# kubectl get nodes
NAME STATUS AGE
192.168.11.11 NotReady 2h
192.168.11.12 NotReady 2h
查看k8s版本
[root@master hello]# kubectl --version
Kubernetes v1.5.2
[root@master ~]# kubectl version
使用kubectl version 命令,输出的信息会显示client和server的版本信息,client代表kubectl版本信息,server代表的是master节点的k8s版本信息
[root@master ~]# kubectl api-versions
#查看命名空间
[root@master ~]# kubectl get ns
#查看flannel 版本 0.7.1
[root@master ~]# flanneld --version
#查看docker版本 1.13.1
[root@master ~]# docker version
小结
完
发布SpringBoot服务(略)