博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
minikube 学习笔记 -- deployment 详解
阅读量:3959 次
发布时间:2019-05-24

本文共 9667 字,大约阅读时间需要 32 分钟。

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 versionminikube version: v1.17.1commit: 043bdca07e54ab6e4fc0457e3064048f34133d7e

minikube 环境搭建

  1. 启动 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
  1. 执行 kubectl 相关命令
➜  ~ kubectl get nodeNAME       STATUS   ROLES                  AGE    VERSIONminikube   Ready    control-plane,master   149m   v1.20.2
  1. 部署应用
#创建一个名为 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

  1. 查看 service 是否创建成功
kubectl get services hello-minikube
  1. 访问 service
minikube service hello-minikube
  1. 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:把集群外的服务引入到集群内部,在集群内部直接使用
  1. 查看仪表盘

仅获取仪表盘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.ymlapiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deployment  labels:    app: nginxspec:  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.ymldeployment.apps/nginx-deployment created

查看 deployment 的创建情况

➜  kubectl get deploymentNAME               READY   UP-TO-DATE   AVAILABLE   AGEbalanced           1/1     1            1           3h49mhello-minikube     1/1     1            1           3h58mnginx-deployment   0/3     3            0           18s

deployment 的创建需要一些时间

➜  deployment kubectl get deploymentNAME               READY   UP-TO-DATE   AVAILABLE   AGEbalanced           1/1     1            1           4hhello-minikube     1/1     1            1           4h10mnginx-deployment   3/3     3            3           11m

查看ReplicaSet

kubectl get rs➜ kubectl get rsNAME                          DESIRED   CURRENT   READY   AGEbalanced-5744b548b4           1         1         1       3h49mhello-minikube-6ddfcc9757     1         1         1       3h59mnginx-deployment-84b8bdb667   3         3         3       39s

查看所有 prod 信息

➜ kubectl get podsNAME                                READY   STATUS    RESTARTS   AGEbalanced-5744b548b4-bl69g           1/1     Running   1          3h50mhello-minikube-6ddfcc9757-b8976     1/1     Running   1          3h59mnginx-deployment-84b8bdb667-44j9w   1/1     Running   0          67snginx-deployment-84b8bdb667-rh2mm   1/1     Running   0          67snginx-deployment-84b8bdb667-xvpmh   1/1     Running   0          67s

查看 deployment 的详细信息

➜  kubectl get deployment -o wideNAME               READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                      SELECTORbalanced           1/1     1            1           5h59m   echoserver   k8s.gcr.io/echoserver:1.4   app=balancedhello-minikube     1/1     1            1           6h8m    echoserver   k8s.gcr.io/echoserver:1.4   app=hello-minikubenginx-deployment   3/3     3            3           129m    nginx        nginx:1.12.2                app=nginx

暴露端口

➜  kubectl expose deployment nginx-deployment --type=NodePortservice/nginx-deployment exposed

可看到暴露的端口为 31895

➜ kubectl get svcNAME               TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGEbalanced           LoadBalancer   10.107.151.143   127.0.0.1     8080:30881/TCP   6h4mhello-minikube     NodePort       10.106.207.87    
8080:30386/TCP 6h13mkubernetes ClusterIP 10.96.0.1
443/TCP 6h28mnginx-deployment NodePort 10.110.56.122
80:31895/TCP 16s

进入 minikube 查看 ip 地址

➜  deployment minikube sshdocker@minikube:~$ lsdocker@minikube:~$ ip add1: lo: 
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 forever2: tunl0@NONE:
mtu 1480 qdisc noop state DOWN group default qlen 1000 link/ipip 0.0.0.0 brd 0.0.0.03: ip6tnl0@NONE:
mtu 1452 qdisc noop state DOWN group default qlen 1000 link/tunnel6 :: brd ::4: docker0:
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:31895Welcome to nginx!

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: stablespec:   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

转载地址:http://iqlzi.baihongyu.com/

你可能感兴趣的文章
网上看到的:ARM入门最好的文章(转)
查看>>
中国最美情诗100句
查看>>
javascript注册window的onload事件问题研究
查看>>
客户端技术分页控件javascript+css,可用于任何服务器端技术
查看>>
学习Swing 的网站[转]
查看>>
Google App engine 的第一个应用 midispot
查看>>
提问的智慧
查看>>
关于dom4j无法解析xmlns问题及生成非UTF-8字符集乱码问题的解决
查看>>
很好的一篇文章 如果让我重做一次研究生 王汎森
查看>>
保护U盘批处理文件
查看>>
hibernate 自动导入sql 文件import.sql 国际化编码的问题的解决方案
查看>>
第七颗头骨 & 忘魂花 凤凰
查看>>
李小龙哲学之言
查看>>
[心情] 如果有一天
查看>>
[Linux] 常用 linux 系统命令及维护备忘
查看>>
[Linux] 关于 Ext4 HowTo
查看>>
[杂记] 新年物语&关于Mysql引擎性能测试
查看>>
[心得] 近期更新&关于Infobright
查看>>
[杂记] 流量统计 & 短信接口
查看>>
[中间件] 消息处理利器 ActiveMQ 的介绍 & Stomp 协议的使用
查看>>