k8s的组件以及安装

目录

概念

k8s的使用场景

k8s的特点

核心组件

master主组件

1.kube-apiserver

2.etcd

3.kube-controller-manager

控制器

4.kube-scheduler

node从节点组件

1.kubelet

2.kube-proxy

3.docker

总结

k8s的核心概念

安装k8s

架构

安装步骤

实验:创建pod


概念

全写:Kubernets

k8s作用:用于自动部署、拓展、管理容器化部署的应用程序。它是半开源的,核心是在谷歌里面,它的底层是由go语言开发的。可以理解成负责自动化运维管理多个容器化的应用的集群。也可以理解为容器编排框架的工具。

k8s的主流版本:1.20

假设用docerk部署了一个nginx,但没有做资源限制,如果一旦访问量增大,nginx有可能占满系统资源,就会出现内存和cpu告警,此时就可以使用自动化运维管理k8s

k8s的使用场景

1.可以多节点部署,不再是单机部署

2.可以自动完成更新和部署

3.解决了跨节点容器之间的通信问题

4.k8s有自我修复机制,使得整个容器集群可以在用户的期望状态下运行

k8s的特点

1.自我修复:在节点故障时,它会自动把该节点上的容器重新部署到其他节点;在容器启动失败时,它会自动的重新启动容器,一般会启动3次,如果3次都失败,就会认为服务不可用。在容器启动时,也会有检测机制(探针),检测容器启动是否正常。以此来确保集群内部的服务能够正常工作。

2.弹性伸缩:在一个容器占用机器的资源比较高时,k8s会自动的增加pod的数量;在资源占用下降的时候,会自动释放pod的数量。就是可以以最小的成本运行服务。

3.自动发布:默认模式是滚动发布模式。同时也可以回滚。也就是k8s在更新的时候不是一次性的更新所有,而是更新一部分,然后再更新剩余的部分。如果有问题,可以随时回滚。

4.服务发现和负载均衡

服务发现:多个容器有一个统一的访问入口,有内部地址和统一的对外地址。会自动负载均衡所有管理的容器,无需考虑容器的ip地址。

5.存储编排:支持外挂存储,分为两种:内部挂载,用的是内部存储卷;外部挂载,可以是本地存储,也可以是公有云(阿里云、百度云、华为云等等),也可以支持网络存储:NFS,ceph。

6.集中化配置和密钥管理:k8s所有的配置可以以加密的形式保存在集群信息中,可以提高集群的安全性。

7.任务的批量处理

核心组件

架构:主从架构,也就是master slave模式,也就是我们所有的操作、管理、运维都是在主节点完成的。从节点:我们一般叫做node节点,就是工作节点,就是用来负载工作的节点。

master主组件

1.kube-apiserver

这是整个集群的大脑,每个组件之间的资源请求和调用操作都是通过apiserver完成的,就是通过api接口发送到各个组件。也就是每个组件之间都和apiserver都有一个api接口。

api接口:作用就是内部的组件和组件之间通信的接口,或者是内部调用方法(代码)的接口。

端口:应用和应用之间,客户端和服务端之间的通信。

内部之间所有资源对象的增删改查和监听也都是由apiserver来完成的,处理完之后再交给etcd进行存储。

2.etcd

它是k8s内部的存储服务,是分布式的键值存储系统,存储了k8s集群的配置和用户配置,以及集群内部服务的信息。只有apiserver可以和etcd通信(读写权限),其他组件要想往etcd存储信息或者读取信息,就必须要通过apiserver。在部署etcd时分布式必须是奇数。

3.kube-controller-manager

又叫运行管理控制器,是k8s集群当中处理常规任务的后台的线程,是k8s集群当中所有资源对象自动化控制的中心。在k8s集群当中,一个资源对应一个控制器。controller-manager就是来管理这些控制器的。

控制器

node controller 节点控制器:节点出现故障时,发现和响应

replication controller 副本控制器:我们创建资源对象时,可以选择创建的个数(pod的数量),需要保证资源对象声明的副本数和创建的数量保持一致。

endpoint controller 端点控制器:指的就是service对应的pod。service用来匹配对应的pod,同时也监听pod的变化,端点就是暴露出来用于对外访问的。

resourcequota controller 资源配额控制器:就是用来确保创建的资源对象不会超过设定的系统资源量

namespace controller 命名空间控制器:作用就是对项目上进行区分,每个命名空间都是独立的,它是用来管理命名空间的生命周期(增删改查)

4.kube-scheduler

它根据调度算法为pod选择一个合适的node节点。

node节点的资源越富裕,负载越小的node节点部署pod的排名就越高

注:以上几个都是在master主节点上完成的

node从节点组件

1.kubelet

它相当于主节点在node节点的监控器,还可以与master节点通信。会定时向apiserver报告服务在node节点上的运行情况,同时还可以接受来自master的调整措施。

kubelet负责节点上pod的生命周期(增删改查)

总结:master的指令传给kubelet,kubelet完成之后传给apiserver,apiserver把node的节点的更新信息保存到etcd

2.kube-proxy

作用是在每个node节点上实现pod的网络代理。它是service的具体载体。负责网络规划和四层负载均衡工作。它也是靠iptables和ipvs来实现服务的映射和访问。

apiserver通过监控kube-proxy来完成对pod的更新和端点的维护,把变化的结果保存在etcd。

内部服务的负载均衡是四层代理,实现内部pod的负载均衡,也就是k8s的每个节点上都有kube-proxy

内部的ip地址依靠flanner 、calico 这两个插件提供内部pod的ip地址

3.docker

是整个集群的最底层,分布式

总结

分为主节点和node节点,主节点就是核心,kube-apiserver大脑:所有的一切都要通过kube-apiserver来调用,所有的一切最终都要保存到etcd中,etcd就是保存集群信息的数据库,怎么部署都是靠kube-controller-manager,往哪里部署靠kube-scheduler。到了node节点上,kubelet负责真正部署、控制容器,跨主机网络之间通信通过kube-proxy,服务是由底层docker来启动的。

流程图

kube-apiserver先接受信息,kube-apiserver传给kube-controller-manager创建资源对象和副本数,kube-apiserver再传给kube-scheduler把pod部署到哪个node上,然后kube-apiserver再传给kubelet根据调度算法,先pull拉取镜像,然后run跑容器,kube-apiserver再传给kube-proxy网络代理和四层负载均衡,最后kubelet把创建的信息传给kube-apiserver,kube-apiserver把信息保存到etcd中。

k8s的核心概念

pod :k8s里面的最小单位,一个pod就是一个正在运行的进程。但是pod的里面包含着容器,可以是一个容器,也可以是多个容器。部署在同一pod当中的容器,它们可以共享网络、存储和计算资源。不同pod之间只能通过集群分配的ip地址进行通信。

Label:标签,它是k8s的特色管理方式,对资源对象进行分类。

简单来说就是:通过标签把pod、service 以及资源对象、控制器进行关联。

service :在集群当中,每个pod都会设定一个ip地址,可能会因为pod的消失,导致ip也随之消失,那么service就是来解决这个问题的核心概念。这个service不是服务,更像一个网关。service用于集群内部访问。

ingress:用于集群外部访问,是整个k8s集群的接入层,是整个集群的外部通信。

service是四层负载均衡,只能是ip+端口

ingress是七层转发

namespace:是资源隔离的方式,是逻辑上的隔离。项目越来越多,集群也会越来越大,此时可以通过命名空间把资源分配到各个命名空间,每个命名空间之间资源不共享,使用的是分配的资源。命名空间在集群当中是唯一的,名字不能重复。

default 是默认命名空间,不做特殊声明,所有的资源都在默认空间

kube-system 系统应用的命名空间

注:如果要查询特定的资源,一定要加上命名空间。

安装k8s

架构

master01 192.168.233.31 安装docker kubeadm kubelet kubectl flannel

node01 192.168.233.32 安装docker kubeadm kubelet kubectl flannel

node02 192.168.233.33 安装docker kubeadm kubelet kubectl flannel

安装步骤

1.三台主机同时操作

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X 清空所有的iptables策略

sed -ri 's/.*swap.*/#&/' /etc/fstab 关闭swap交换分区

for i in (ls /usr/lib/modules/(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo i; /sbin/modinfo -F filename i >/dev/null 2>&1 && /sbin/modprobe $i;done

加载ipvs的模块

hostnamectl set-hostname master01

hostnamectl set-hostname node01

hostnamectl set-hostname node02

vim /etc/hosts

注:这里修改主机名和映射关系可以不做

cat > /etc/sysctl.d/kubernetes.conf << EOF

#开启网桥模式,可将网桥的流量传递给iptables链

net.bridge.bridge-nf-call-ip6tables=1

net.bridge.bridge-nf-call-iptables=1

#关闭ipv6协议

net.ipv6.conf.all.disable_ipv6=1

#开启路由转发

net.ipv4.ip_forward=1

EOF

sysctl --system

2.安装docker组件:

三台主机同时操作

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce-24.0.1 docker-ce-cli-24.0.1 containerd.io

mkdir /etc/docker

cat > /etc/docker/daemon.json <<EOF

{

"registry-mirrors": ["https://hub.littlediary.cn/"],

"exec-opts": ["native.cgroupdriver=systemd"],

"log-driver": "json-file",

"log-opts": {

"max-size": "100m"

}

}

EOF

systemctl daemon-reload

systemctl restart docker

systemctl enable docker

docker info | grep "Cgroup Driver" 看一下是不是systemd

3.安装kubelet组件:

三台主机同时操作

yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15

systemctl enable kubelet 注:所有的组件都是以pod运行的,必须要设置开机自启

kubeadm config images list --kubernetes-version 1.20.15

解释: pause是镜像,也是特殊容器,这个容器的作用就是保持pod当中其他的容器的运行。

我们创建pod,首先是拉取镜像,pod当中会有一个pause,pause会在每个pod中创建一个命名空间。pod的生命周期结束,pause容器也会退出,释放该pod的网络命名空间。

coredns:域名解析

4.在master01上操作

kubeadm init \

--apiserver-advertise-address=192.168.233.31 \

--image-repository registry.aliyuncs.com/google_containers \

--kubernetes-version=v1.20.15 \

--service-cidr=10.96.0.0/16 \

--pod-network-cidr=10.244.0.0/16 \

--token-ttl=0

注:apiserver-advertise-address是内部通信的ip地址,指向的是主,也可以用0.0.0.0表示任意主机

image-repository registry.aliyuncs.com/google_containers 指定镜像的仓库(k8s组件的仓库)

kubernetes-version=v1.20.15 k8s的版本 1.20.15

service-cidr=10.96.0.0/16 service的网段

pod-network-cidr=10.244.0.0/16 pod分配的网段,其中10.244.0.0/16是flannel的默认网段,calico

:192.168.0.0/16

token-ttl=0 表示token永不过期,默认有效期是24小时

然后复制最下面的一段话到node01和node02(根据自己的上面复制)

注:如果不知道,可以再生成 只要执行 kubeadm token create --print-join-command

5.设置节点的kubelet

三台主机同时操作

mkdir -p $HOME/.kube

cd /etc/kubernetes/

其中admin.conf是kubeadm为集群配置的一个具有管理员权限的认证文件,apiserver需要通过admin的认证,kubelet才能和apiserver进行交互

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

chown (id -u):(id -g) $HOME/.kube/config

systemctl restart kubelet

回到master01主机上

kubectl edit cm kube-proxy -n=kube-system 编辑它的yaml文件 注:这里操作跟vim一样

在下面输入 /mode

然后在mode中间添加ipvs然后保存即可

kubectl get node

kubectl get cs

检查集群的状态

vim /etc/kubernetes/manifests/kube-scheduler.yaml

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

kubectl get cs

两个都要是ok

kubectl get pod -n kube-system

这里必须要1/1

systemctl status kubelet 查看kubelet是否开启

6.安装flannel网络插件

三台主机上面同时操作

拖入flannel.tar和cni-plugins-linux-amd64-v0.8.6以及kube-flannel.yml

docker load < flannel.tar

mv /opt/cni /opt/cni_bak

cd cni_bak/

mkdir -p /opt/cni/bin

cd /opt/

tar -xf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin/

在master01上面操作

kubectl apply -f kube-flannel.yml

kubectl get pod -n kube-system

kubectl get node

7.添加kubelet自动补齐功能

在master01 主机上操作

vim /etc/profile

在最后添加source <(kubectl completion bash)

source /etc/profile

kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

8.k8s证书认证

在master01主机上操作

把update-kubeadm-cert拖入master01主机上

chmod 777 update-kubeadm-cert.sh

./update-kubeadm-cert.sh all

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not 查看还有多少年命令

注:以上就是k8s的基本安装

实验:创建pod

kubectl get deployments.apps 查看资源对象

deployments.apps 就是资源对象

kubectl create deployment test1 --image=nginx:1.22 --replicas=3 创建资源对象

kubectl get pod

kubectl get pod -o wide

kubectl expose deployment test1 --port=30000 --target-port=80

kubectl get svc

kubectl edit svc test1

最后的修改为

kubectl get svc

进入:

kubectl exec -it 最后加bash

相关推荐
yuguo.im34 分钟前
Docker 两大基石:Namespace 和 Cgroups
运维·docker·容器
会飞的土拨鼠呀41 分钟前
docker部署 outline(栗子云笔记)
笔记·docker·容器
没有bug.的程序员2 小时前
高频IO服务优化实战指南
java·jvm·spring·容器
lisanmengmeng3 小时前
docker 方式安装部署禅道zentao(五)
运维·docker·容器
露临霜5 小时前
Docker安装nginx
nginx·docker·容器
CAFEBABE 347 小时前
安装完docker之后怎么使用
运维·docker·容器
测试人社区—小叶子8 小时前
测试开发面试高频“灵魂八问”深度解析与应答策略
网络·人工智能·测试工具·云原生·容器·面试·职场和发展
VermiliEiz9 小时前
使用二进制文件方式部署kubernetes(1)
kubernetes·云计算
kevin_水滴石穿10 小时前
centos7 离线安装docker-compose(纯绿色安装)
运维·docker·容器