1.K8s集群架构结构介绍
2.K8s创建一次部署
3.K8s的自愈
4.Pod介绍
5.K8s将多个pod封装成一个统一服务
6.K8s的滚动升级
7.K8s的对象描述符文件简单介绍
8.K8s安装lens
1.K8s集群架构结构介绍
在系统学习K8s——简介与安装中,我们学习了K8s的集群架构为主从结构。
master节点的关键组件:
- kubelet(监工):所有节点必备,控制这个节点所有的pod生命周期以及与api-server的交互工作。
- api-server: 负责接收所有请求,集群内对集群的任何修改都是通过命令行,UI界面把请求发给api-server才能执行。api-server是整个集群对内,堆外的唯一入口。
- kube-proxy:整个节点的网络流量负责
- 都有容器运行时环境
worker节点:
- kubelet(监工):所有节点必备的。控制这个节点所有pod的生命周期以及与api-server交互等工作
- kube-proxy:整个节点的网络流量负责
- cri:都有容器运行时环境
2.K8s创建一次部署
基本命令:
kubectl create deployment 这次部署的名字 --image=应用的镜像
#创建nginx,并部署3份
kubectl create deployment my-nginx --image=nginx --replicas=3
#Create a deployment named my-nginx that runs the nginx image and expose port 80.
kubectl create deployment my-nginx --image=nginx --port=80
Deployment(部署):
在k8s中,通过kubectl create deployment命令,可以创建应用程序(docker image)的实例(docker container),这个实例会被包含在pod中,pod是K8s中的最小单元。
在K8s集群中发布deployment后,deployment将指示K8s如何创建和更新应用程序的实例,master节点将应用程序实例调度到集群中等具体节点上。
3.K8s的自愈
我们先创建3个节点的nginx,然后再删除一个pod,此时deployment有自愈机制,会自行恢复。
kubectl create deployment my-nginx --image=nginx --replicas=3
然后我们删除一个:
kubectl delete pod my-nginx-6b74b79f57-5bwp2
自愈原理:
创建应用程序实例后,Kubernetes Deployment Controller会持续监控这些实例,如果运行实例的worker节点关机或者删除,则Kubernetes Deployment Controller将在集群资源中寻找最优的一个worker节点上创建一个新的实例。这提供了一种自我修复机制来解决机器故障或者维护问题。
在容器编排之前的年代,各种安装脚本通常用于开机启动应用程序,但是不能够使用应用程序从机器故障中恢复。通过创建应用程序实例并确保它们在集群中的运行实例个数,Kubernetes Deployment 提供了一种完全不同的方式来管理应用程序。
4.Pod介绍
前面简单实操了一下K8s,经常提到pod,现在我们来讲解一下pod是什么。
Pod(容器组)是K8s中的一个抽象的概念,用于存放一组container(可包含一个或者多个container),以及这些container的一些共享资源,这些资源有:
- 共享存储,称为卷(Volumes)
- 网络,每个pod在集群中都有一个唯一IP,pod中的container共享该ip地址。
- container的基本信息,例如镜像版本,暴露端口之类。
Pod(容器组)是K8s集群上的基本单元。当我们在K8s上创建Deployment时,会在集群上创建包含容器的pod(而不是直接创建容器)。每个pod都要与运行他的worker节点绑定,并保持在那里直到终止或删除。如果node发生故障,则会在集群中的其它node上运行相同的pod。
pod的故障排除常用命令:
# kubectl get 资源类型
#获取类型为Deployment的资源列表
kubectl get deployments
#获取类型为Pod的资源列表
kubectl get pods
#获取类型为Node的资源列表
kubectl get nodes
# kubectl describe 资源类型 资源名称
#查看名称为nginx-XXXXXX的Pod的信息
kubectl describe pod nginx-XXXXXX
#查看名称为nginx的Deployment的信息
kubectl describe deployment my-nginx
# kubectl logs Pod名称
#查看名称为nginx-pod-XXXXXXX的Pod内的容器打印的日志
#本案例中的 nginx-pod 没有输出日志,所以您看到的结果是空的
kubectl logs -f nginx-pod-XXXXXXX
# kubectl exec Pod名称 操作命令
# 在名称为nginx-pod-xxxxxx的Pod中运行bash
kubectl exec -it nginx-pod-xxxxxx /bin/bash
5.K8s将多个pod封装成一个统一服务
我们通过service可以将多个pod封装成一组服务:
先来介绍一下什么是service:
K8s的service是一个抽象层,他将一组pod聚合成一个service提供给外部调用,支持暴露,负载均衡,服务发现等。
尽管每一个pod都有IP地址,但是如果没有service,这些IP不会暴露在集群外部,Service允许我们的应用程序接受流量,service有以下几种type方式暴露。
- ClusterIP (默认) - 在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问。
- NodePort - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用
<NodeIP>:<NodePort>
从集群外部访问 Service。是 ClusterIP 的超集。 - LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部IP。是 NodePort 的超集。
- ExternalName - 通过返回带有该名称的 CNAME 记录,使用任意名称(由 spec 中的
externalName
指定)公开 Service。不使用代理。这种类型需要kube-dns
的v1.7或更高版本。
我们刚刚在发布nginx的时候,启动了3个副本,然后我们将这3个nginx组装成一个service。
kubectl expose deployment my-nginx --port=80 --target-port=80 --type=NodePort
## --port:集群内访问service的端口 8912
## --target-port: pod容器的端口 8080
## --nodePort: 每个机器开发的端口 30403
创建好后,我们进行验证
## 进行验证
kubectl get svc
curl ip:port
然后我们进入每一个pod内部修改nginx的主页标识,看看是否会负载均衡。
kubectl exec -it pod名 /bin/bash #进pod并执行命令
cd /usr/share/nginx/html/
echo 11111111 > index.html
6.K8s的滚动升级介绍
滚动升级就是允许通过使用新的pod逐步更新老的pod从而实现Deployments更新,停机时间为0.
与应用程序的扩展类似,如果暴露了Deployment,服务(Service)将在更新期间仅对可用的pod进行负载均衡,可用pod是应用程序用户可用的实例。
滚动更新过程如图所示:
初始状态:
下线一个pod,然后上线一个pod:
逐步更新:
全部更新完成:
kubectl set image deployment/my-nginx nginx=nginx:1.9.1
7.K8s的对象描述符文件简单介绍
我们之前使用K8s的命令行做了一些基本的操作,实际上这些命令非常多,记住及其困难,所以我们一般通过声明式API,通过对象描述符的文件YML来用文件固化操作。
我们要将我们要部署的服务写成yml文件。
Pod --》 yaml , Deploy--》yaml , Service --》 yaml
然后apply这个文件就可以了。
kubectl apply -f xxx.yaml
部署一个应用的yml:
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的类型,我们使用的是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.7.9 #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
暴露应用
apiVersion: v1
kind: Service
metadata:
name: nginx-service #Service 的名称
labels: #Service 自己的标签
app: nginx #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec: #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
selector: #标签选择器
app: nginx #选择包含标签 app:nginx 的 Pod
ports:
- name: nginx-port #端口的名字
protocol: TCP #协议类型 TCP/UDP
port: 80 #集群内的其他容器组可通过 80 端口访问 Service
nodePort: 32600 #通过任意节点的 32600 端口访问 Service
targetPort: 80 #将请求转发到匹配 Pod 的 80 端口
type: NodePort #Serive的类型,ClusterIP/NodePort/LoaderBalancer
8.K8s安装lens
我们可以在windows上安装一个lens客户端(https://k8slens.dev/), 这样就可以使用图形界面的方式来操作K8s,非常便捷。
安装完毕后使用 进行操作,把/etc/kubernetes/admin.conf 的文件全部复制进去,就可以链接并进行操作了!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。