minikube 学习笔记 -- deployment 详解
minikube 是什么minikube 可以理解为一个可以运行在本地的,单节点的 Kubernetes,我们可以通过在里面创建 Pods 来创建对应的服务kubernetes 是什么Kubernetes 是容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。minikube 安装MACbrew install minikubeLinuxcurl -LO https://sto
minikube 是什么
minikube 可以理解为一个可以运行在本地的,单节点的 Kubernetes,我们可以通过在里面创建 Pods 来创建对应的服务
kubernetes 是什么
Kubernetes 是容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
minikube 安装
MAC
brew install minikube
Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
详细安装见 官方文档
查看安装是否成功
➜ ~ minikube version
minikube version: v1.17.1
commit: 043bdca07e54ab6e4fc0457e3064048f34133d7e
minikube 环境搭建
- 启动 minikube
➜ ~ minikube start
😄 Darwin 10.15.7 上的 minikube v1.17.1
✨ 根据现有的配置文件使用 docker 驱动程序
👍 Starting control plane node minikube in cluster minikube
🔄 Restarting existing docker container for "minikube" ...
🐳 正在 Docker 20.10.2 中准备 Kubernetes v1.20.2…
🔎 Verifying Kubernetes components...
🌟 Enabled addons: default-storageclass, storage-provisioner, dashboard
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
- 执行 kubectl 相关命令
➜ ~ kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 149m v1.20.2
- 部署应用
#创建一个名为 hello-minikube 的 deployment,运行 k8s.gcr.io/echoserver:1.4 这个镜像
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
#为 deployment 的 hello-minikube 创建 service,指定 service 类型为 NodePort ,并绑定 8080 端口
kubectl expose deployment hello-minikube --type=NodePort --port=8080
Kubectl 常用命令详解:http://docs.kubernetes.org.cn/535.html
- 查看 service 是否创建成功
kubectl get services hello-minikube
- 访问 service
minikube service hello-minikube
- Loadbalancer 部署
kubectl create deployment balanced --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment balanced --type=LoadBalancer --port=8080
service 的类型
- ClusterIP:默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP
- NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,外部可以通过NodeIP:NodePort来访问该服务
- LoadBalancer:在NodePort的基础上,借助cloud provider创建一个外部负载均衡器,并将请求转发到NodeIP:NodePort
- ExternalName:把集群外的服务引入到集群内部,在集群内部直接使用
- 查看仪表盘
仅获取仪表盘URL
minikube dashboard --url
直接跳转
➜ ~ minikube dashboard
🤔 正在验证 dashboard 运行情况 ...
🚀 Launching proxy ...
🤔 正在验证 proxy 运行状况 ...
🎉 Opening http://127.0.0.1:63251/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
可以看到如下展示
minikube 的使用
重点介绍以下三点:
- deployment
- service
- HPA
deployment
官方介绍
Deployment 为 Pod 和 Replica Set 提供声明式更新。 我们只需要在 Deployment 中描述想要的目标状态是什么,Deployment Controller 就会帮我们将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。
具体表现为
定义一组 Pod 期望数量,Deployment Controller 会维持 Pod 数量与期望数量一致
配置 Pod 的发布方式,Deployment Controller 会按照给定的策略更新 Pod,保证更新过程中不可用 Pod 维持在限定数量范围内
如果发布有问题支持回滚
deployment 原理
- 控制器模型
Kubernetes 中有一个 kube-controller-manager
的组件,是控制器的集合,每一个控制器负责某种编排功能,deployment 是控制器中的一种
可以简单的这样描述:
for {
实际状态 := 获取集群中对象X的实际状态
期望状态 := 获取集群中对象X的期望状态
if 实际状态 == 期望状态 {
什么都不做
}else{
执行编排动作,将实际状态调整为期望状态
}
}
实际状态:往往来自于 Kubernetes 集群本身。比如 Kubelet 通过心跳汇报的容器状态和节点状态,或者监控系统中保存的应用监控数据,或者控制器主动收集的它感兴趣的信息,这些都是常见的实际状态的来源;
期望状态:一般来自用户提交的 YAML 文件,这些信息都保存在 Etcd 中
例如:
- Deployment Controller 会从 Etcd 中获取到所有携带 “app:xxx”标签的 Pod,然后统计它们的数量,这是实际状态
- Deployment 对象的 replicas 的值是期望状态 Deployment
- Controller 会将两个状态做比较,然后根据比较结果,确定是创建新的 Pod,还是删除已有 Pod
deployment 实验练习
编写 yaml 文件如下:
➜ cat deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12.2
ports:
- containerPort: 80
根据 deploy_nginx.yml 创建 deployment
➜ kubectl create -f deploy_nginx.yml
deployment.apps/nginx-deployment created
查看 deployment 的创建情况
➜ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
balanced 1/1 1 1 3h49m
hello-minikube 1/1 1 1 3h58m
nginx-deployment 0/3 3 0 18s
deployment 的创建需要一些时间
➜ deployment kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
balanced 1/1 1 1 4h
hello-minikube 1/1 1 1 4h10m
nginx-deployment 3/3 3 3 11m
查看ReplicaSet
kubectl get rs
➜ kubectl get rs
NAME DESIRED CURRENT READY AGE
balanced-5744b548b4 1 1 1 3h49m
hello-minikube-6ddfcc9757 1 1 1 3h59m
nginx-deployment-84b8bdb667 3 3 3 39s
查看所有 prod 信息
➜ kubectl get pods
NAME READY STATUS RESTARTS AGE
balanced-5744b548b4-bl69g 1/1 Running 1 3h50m
hello-minikube-6ddfcc9757-b8976 1/1 Running 1 3h59m
nginx-deployment-84b8bdb667-44j9w 1/1 Running 0 67s
nginx-deployment-84b8bdb667-rh2mm 1/1 Running 0 67s
nginx-deployment-84b8bdb667-xvpmh 1/1 Running 0 67s
查看 deployment 的详细信息
➜ kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
balanced 1/1 1 1 5h59m echoserver k8s.gcr.io/echoserver:1.4 app=balanced
hello-minikube 1/1 1 1 6h8m echoserver k8s.gcr.io/echoserver:1.4 app=hello-minikube
nginx-deployment 3/3 3 3 129m nginx nginx:1.12.2 app=nginx
暴露端口
➜ kubectl expose deployment nginx-deployment --type=NodePort
service/nginx-deployment exposed
可看到暴露的端口为 31895
➜ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
balanced LoadBalancer 10.107.151.143 127.0.0.1 8080:30881/TCP 6h4m
hello-minikube NodePort 10.106.207.87 <none> 8080:30386/TCP 6h13m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h28m
nginx-deployment NodePort 10.110.56.122 <none> 80:31895/TCP 16s
进入 minikube 查看 ip 地址
➜ deployment minikube ssh
docker@minikube:~$ ls
docker@minikube:~$ ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
link/tunnel6 :: brd ::
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:58:d5:a5:21 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
访问成功
docker@minikube:~$ curl 172.17.0.1:31895
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
yaml 文件详解
yaml 文件包含四个部分:
apiVersion: 表示版本
kind: 表示资源
metadata: 表示元信息
spec: 资源规范字段
eg:
apiVersion: apps/v1 # 指定api版本,此值必须在kubectl api-versions中
kind: Deployment # 指定创建资源的角色/类型
metadata:
name: demo # 资源的名字,在同一个namespace中必须唯一
namespace: default # 部署在哪个namespace中
labels: # 设定资源的标签
app: demo
version: stable
spec:
replicas: 1 # 声明副本数目
revisionHistoryLimit: 3 # 保留历史版本
selector: # 选择器
matchLabels: # 匹配标签
app: demo
version: stable
strategy: # 策略
rollingUpdate: # 滚动更新
maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数
maxUnavailable: 30% # 示在更新过程中能够进入不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
type: RollingUpdate # 滚动更新策略
template: # 模版
metadata: # 资源的元数据/属性
annotations: # 自定义注解列表
sidecar.istio.io/inject: "false" # 自定义注解名字
labels: # 设定资源的标签
app: demo
version: stable
spec: # 资源规范字段
containers:
- name: demo # 容器的名字
image: demo:v1 # 容器使用的镜像地址
imagePullPolicy: IfNotPresent # 每次Pod启动拉取镜像策略,三个选择 Always、Never、IfNotPresent
# Always,每次都检查;Never,每次都不检查(不管本地是否有);IfNotPresent,如果本地有就不检查,如果没有就拉取
resources: # 资源管理
limits: # 最大使用
cpu: 300m # CPU,1核心 = 1000m
memory: 500Mi # 内存,1G = 1024Mi
requests: # 容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 100m
memory: 100Mi
livenessProbe: # pod 内部健康检查的设置
httpGet: # 通过httpget检查健康,返回200-399之间,则认为容器正常
path: /healthCheck # URI地址
port: 8080 # 端口
scheme: HTTP # 协议
# host: 127.0.0.1 # 主机地址
initialDelaySeconds: 30 # 表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 # 检测的超时时间
periodSeconds: 30 # 检查间隔时间
successThreshold: 1 # 成功门槛
failureThreshold: 5 # 失败门槛,连接失败5次,pod杀掉,重启一个新的pod
readinessProbe: # Pod 准备服务健康检查设置
httpGet:
path: /healthCheck
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 5
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: # 通过tcpSocket检查健康
# port: number
ports:
- name: http # 名称
containerPort: 8080 # 容器开发对外的端口
protocol: TCP # 协议
imagePullSecrets: # 镜像仓库拉取密钥
- name: harbor-certification
affinity: # 亲和性调试
nodeAffinity: # 节点亲和力
requiredDuringSchedulingIgnoredDuringExecution: # pod 必须部署到满足条件的节点上
nodeSelectorTerms: # 节点满足任何一个条件就可以
- matchExpressions: # 有多个选项,则只有同时满足这些逻辑选项的节点才能运行 pod
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
更多推荐
所有评论(0)