※本文档适用于下面的参考文档学习及配置后,再进行学习。
参考文档:
1.Windows10 环境下的 Docker
2.Windows 10 Kubernetes(minikube)搭建
官方文档:
学习 Kubernetes 基础知识
Kubernetes核心概念
1.概念一览
- Kubernetes Master(Kubernetes主节点)
集群的主节点机器。 - Node(节点)
集群的节点机器。 - Service(svc)(服务)
多个相同名称的POD副本 使用不同的IP地址,Service提供DNS服务,通过指定的名称对多个POD对象进行软件级负载均衡访问。 - Replication Controller(复制控制器)
使用控制器,可以快速创建指定个数的相同POD副本,并且对已经创建的POD副本进行监听,当POD副本对象不足指定个数或者POD副本不响应,控制器会自动创建POD副本来保证指定个数的相同POD副本可以访问。 - Label(label)(标签)
POD副本进行名称及类型的标记,例如:frontend(前端),backend(后端) - Pod
多个docker容器和 卷(Volumes) 在同一个POD中,且多个容器见可以使用localhost进行访问。
Pod是短暂的,卷(Volumes) 是持久的,当创建新的POD副本时,可以快速的从卷中获取数据。 - Deployment(部署)
代替 Replication Controller,Deployment 用来ReplicaSet,用来实现POD扩容,升级,回滚等作业。 - ReplicaSet
用来创建指定个数的POD对象及扩容POD个数,并且监听POD状态,当POD异常时,自动销毁异常POD,并创建新的POD来保持整体的POD副本数目。
2.网络框架
1.kubectl是kubernetes的命令行工具,用于创建,查询,删除kubernetes及容器相关的对象。
2.kubelet是用来Pod 管理,容器健康检查 ,容器监控
3.kubectl命令
3.1创建nginx POD对象
创建nginx的deployment对象有两种命令格式
命令格式1:kubectl run -> 该方式已被kubectl create取代
kubectl run nginx --image=nginx
解释:kubectl run 部署对象名称 --image=docker镜像名称
缺省参数:
--port 容器的访问端口号,默认为80,例如:--port=8080
--labels 容器的名称标签,格式app=名称,env=环境,例如:--labels="app=hazelcast,env=prod"
--replicas POD的副本数量,例如:--replicas=5
命令格式2:kubectl create
kubectl create deployment nginx --image=nginx
解释:kubectl create deployment 部署对象名称 --image=docker镜像名称
3.2查看 POD对象列表
kubectl get pods
列表中NAME字段的含义:
当创建多个副本的POD时,docker name的前缀相同
STATUS字段的含义:
ImagePullBackOff :镜像无法下载
解决方案参考2.Windows 10 Kubernetes(minikube)搭建 中的 3.14 配置minikube的docker镜像加速
Running :下载并且启动docker镜像成功
在minikube的机器中,使用docker ps命令,可以看到nginx服务器正常启动
3.3查看 deployment 对象创建的配置log
方式1:命令行
kubectl describe pod nginx
解释:kubectl describe pod deployment对象的名称
方式2:浏览器
在kubernetes-dashboard的网页中,也可以看到deployment的对象的信息
3.4 删除deployment的对象(POD和ReplicaSet)
kubectl delete -n default deployment nginx
解释:kubectl delete -n 命名空间 deployment deployment名称
3.5 访问POD对象
1.查询当前POD的详细信息,查找到IP地址
kubectl get pod -o wide
2.登录到minikube服务器中,使用curl命令获取nginx的index文件内容
minikube ssh
$ curl IP地址/index.html
3.6 扩展POD副本的数量
1.扩展POD副本
kubectl scale deployment nginx --replicas=4
解释:kubectl scale deployment POD名称--replicas=扩展后的POD副本总数量
2.查看POD副本的状态
在POD状态中可以看到相同POD正在被创建。
kubectl get pod
3.所有POD副本被创建完成
3.7 验证ReplicaSet的POD监听
1.关闭多个POD副本中的某一个Docker容器
例如:
副本1:nginx-86c57db685-4k7bn
副本2:nginx-86c57db685-5qmjm
副本3:nginx-86c57db685-6ds9q
副本4:nginx-86c57db685-t7kxf
登录到minikube服务器,关闭副本4(nginx-86c57db685-t7kxf)的docker 对象
minikube ssh
$ docker ps
获取到容器的名称前缀为nginx-86c57db685-t7kxf的容器ID
$ docker stop 容器ID
2.查询pod的信息
RESTARTS的次数加1,ReplicaSet自动恢复了POD副本
kubectl get pod
3.删除POD副本
kubectl delete pod nginx-86c57db685-t7kxf
解释:kubectl delete pod POD副本名称
4.再次查询POD副本
副本4被删除,ReplicaSet自动创建了新的POD副本,保持整体的POD数量
kubectl get pod -o wide
3.8 创建services(svc),访问POD副本
1.查询pod副本的详细信息
kubectl get pod -o wide
发现每一个POD副本有独立的IP地址,如果想访问它们,就需要添加负载均衡,并且当添加或者删除POD副本时,POD副本的IP地址会发生变更,需要维护负载均衡。
services是一组提供相同服务的POD副本对外的访问接口,且支持轮播的负载均衡,在添加或者删除POD副本时,自动进行负载均衡设定。
2.创建services
这里只介绍services的2种常用类型
集群内部访问:ClusterIP:使用一个集群固定IP,这个是默认选项
集群外部访问:NodePort:使用一个集群固定IP,并且会暴露一个端口给外部网络进行访问,端口的范围(默认是30000-32767)
ClusterIP模式
1.创建services
kubectl expose deployment nginx --port=31000 --target-port=80
解释:kubectl expose deployment 部署名称 --port=集群内访问的端口号 --target-port=容器的端口号
2.查询services
kubectl get svc
3.使用deployment的service的集群IP访问POD副本
1.登录到minikube服务器中
minikube ssh
2.访问nginx的index.html文件
curl 10.97.91.225:31000/index.html
3.9 删除services(svc)
kubectl delete svc nginx
解释:kubectl delete svc service名称
3.10 创建NodePort类型的services(svc)
NodePort
方式1:
a.从ClusterIP方式修改为NodePort
修改service的配置
kubectl edit svc nginx
解释:kubectl edit svc service名称
修改前:
修改后:
b.保存退出
c.再次查询service
kubectl get svc
TYPE变更成NodePort,并且生成一个外网访问的端口
d.获取minikube服务器集群的主机IP地址
注:由于切换的hyper-v的虚拟交换机的类型,导致了IP变更
查询minikube服务器的IP地址
方式1:
1.登录minikube服务器
minikube ssh
2.查询IP地址
$ ifconfig
方式2:
minikube ip
e.浏览器访问
http://minikube服务器IP:30302
方式2:
a.创建services,并指定类型为NodePort
kubectl expose deployment nginx --port=32000 --type=NodePort --target-port=80
解释:kubectl expose deployment 部署名称 --port=集群内访问的端口号 --target-port=容器的端口号
b.再次查询service
kubectl get svc
e.浏览器访问
http://minikube服务器IP:30140
4 资源清单
k8s使用资源清单式进行相关组件的构建,即yaml文件格式配置文件创建POD,service等。
注意:YAML文件中不支持使用tab
获取帮助文档
kubectl explain pod
4.1 公共配置
apiVersion: v1 #kubernetes的API版本号
kind: <string> #资源类型 例如Pod,service
metadata: <Object> #元数据,资源的主要信息,例如命名,所在空间等
name: <string> #资源名称 例如Pod名称
namespace: <string> #资源所属命名空间 如Pod的默认值 default
labels: <map[string]string> #标签列表 资源类型添加标签
key1: value1 #例如 version: v1
key2: value2 #例如 app: myfirstnginxapp
4.2 Pod类型配置的spec设定
spec: <Object> #必选,期望的状态
containers: <[]Object> -required- #pod中的容器列表,可以有多个容器
- name: <string> -required- #容器名称
image: <string> -required- #容器的镜像名称及版本号,例如
imagePullPolicy: <string> #获取镜像的策略(Always, Never, IfNotPresent)
#1.Alawys表示总是下载镜像
#2.IfnotPresent表示优先使用本地镜像,如果本地不存在,则下载镜像
#3.Nerver表示仅使用本地镜像,如果不存在,不进行下载。
#注:默认策略为IfNotPresent,当版本号为lastest,则策略为Always
command: <[]string> #容器的启动命令列表
4.2.1 使用资源文件-创建Pod
1.创建Deployment对象
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
labels:
app: k8s-nginx
spec:
replicas: 2 #生成复本数量为2
selector:
matchLabels:
app: k8s-nginx
template:
metadata:
labels:
app: k8s-nginx
annotations: #用于选择对象并查找满足某些条件的对象集合 Annotations不会被Kubernetes直接使用,其主要目的是方便用户阅读查找
app: nginx-clouster
spec:
containers:
- name: nginx
image: docker.io/nginx
livenessProbe: #livenessProbe(可用性/存活探针) 对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可,另一种探针
#readiness probe(就绪探针)就绪探针的作用是控制哪些pod可以作为svc的后端,如果pod不是就绪状态,就把它从svc load balancer中移除.
httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常
path: / #URI地址
port: 80 #端口号
#host: 127.0.0.1 #主机地址
scheme: HTTP #支持的协议,http或者https
initialDelaySeconds: 5 #容器启动后第一次执行探测是需要等待多少秒。
timeoutSeconds: 1 #探测超时时间。默认1秒,最小1秒。
imagePullPolicy: IfNotPresent #[Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
resources: #资源限制和请求的设置
limits:
cpu: 1 #CPU最大限制
memory: 3000Mi #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests:
cpu: 0.2 #Cpu请求,容器启动的初始可用数量,副本个数*cpu的总数量不可超过kubernetes安装时系统设定的上限
memory: 100Mi #内存请求,容器启动的初始可用数量
ports:
- containerPort: 80 #容器需要监听的端口号
2.创建Service对象
apiVersion: v1
kind: Service
metadata:
labels:
run: nginx
name: nginx
namespace: default
spec:
type: NodePort
ports:
- port: 88 #这里的端口和clusterIP对应,即clusterIP:80,供内部访问。
targetPort: 80 #端口一定要和container暴露出来的端口对应,nginx暴露出来的端口是8081,所以这里也应是8081
protocol: TCP
nodePort: 30060 # 所有的节点都会开放此端口,此端口供外部调用。有效范围30000-32767
selector:
app: k8s-nginx
查询pod状态
kubectl get pods -o wide
浏览器访问
http://minikube服务器IP:30060
3.查看POD日志
kubectl logs Deployment的POD对象