minikube 学习笔记 -- deployment 详解

2023-05-16

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 环境搭建

  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 node
NAME       STATUS   ROLES                  AGE    VERSION
minikube   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.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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

minikube 学习笔记 -- deployment 详解 的相关文章

随机推荐

  • MyBatis(二)—— 进阶

    一 详解配置文件 1 1 核心配置文件 官方建议命名为mybatis config xml xff0c 核心配置文件里可以进行如下的配置 xff1a lt environments gt 和 lt environment gt mybati
  • mysql常用sql处理

    一 查询字段处理 1 将Int 转为varchar经常用 concat函数 xff0c 比如concat 8 0 得到字符串 80 2 将varchar 转为Int 用 cast a as signed xff0c a为varchar类型的
  • 【电机驱动芯片(H桥、直流电机驱动方式)——DRV8833、TB6612、A4950、L298N的详解与比较】

    文章目录 一 全H桥电路基础知识1 原理图 xff08 以全NMOS管为例 xff09 2 H桥工作模式正转模式反转模式电流衰减模式 3 补充 二 DRV8833芯片介绍1 基本介绍2 引脚功能3 功能框图4 结构详细介绍5 逻辑控制6 另
  • 个人面试分享(小厂)

    个人面试分享 xff08 小厂 xff09 今天终于提起键盘了 xdm xff0c 假期过得如何 xff0c 祝大家节日快乐 上个月利用一些请假面试了几家公司 xff0c 然后想跟大家分享下一些面试题 xff08 面试的公司规模大概是50
  • 在HAL库中的使用printf()函数和sprintf()函数

    在HAL库中的使用printf xff08 xff09 函数和sprintf xff08 xff09 函数 1 printf xff08 xff09 2 sprintf xff08 xff09 xff1a 运行环境为 xff1a HAL库
  • 内部函数和外部函数

    内部函数 xff08 静态函数 xff09 xff1a 只能被本文件中其它函数调用 定义内部函数时 xff0c 在函数名核函数类型的前面加上static static int fun int a int b fun是内部函数 xff0c 不
  • C语言文件操作函数fwrite导致写入文件的内容乱码的问题解决方案

    fwrite 函数用来向文件中写入块数据 xff0c 它的原型为 xff1a size t fwrite void ptr size t size size t count FILE fp 参数说明 xff1a ptr 为内存区块的指针 x
  • 通信协议(三)——IIC协议

    1 基础知识 1 1 概念 IIC通讯协议 Inter xff0d Integrated Circuit xff0c 也常被写作I2C 是由 Philips 公司开发的一种简单 双向二线制同步串行总线 xff0c 只需要两根线即可在连接于总
  • linux经典面试题----开机启动流程

    linux开机启动流程 1 xff0c power on 开机 2 xff0c POST开机自检 由主板上的BIOS程序来完成 3 xff0c BIOS对硬件进行检测 BIOS xff1a 基本输入输出系统 xff0c 是个人电脑启动时加载
  • 高可用和负载均衡学习笔记

    负载均衡 LB xff1a load balancer 化整为零 高可用 xff08 HA xff09 xff1a High Avilibility 互相备份 xff0c 互相替换 防止单点故障 好处 xff1a 防止单点故障 xff0c
  • 浅谈列表和元组的区别

    常见面试题 列表 xff08 list xff09 和元组 xff08 tuple xff09 的区别和使用场景 一 相同点 列表和元组都是序列化类型的容器对象 xff0c 可以存放任何类型的数据 xff0c 支持切片和迭代 二 不同点 列
  • 详解三次握手

    简述三次握手的过程 应用场景 xff1a 当客户端向服务器端发送数据之前 xff0c 需要建立一个TCP连接 第一次握手 xff1a 客户端向服务器端发送一个SYN请求包 xff08 序列号syn为x xff09 并进入SYN SENT状态
  • win10 切换Fn热键

    切换Fn热键 新买的联想小新 xff0c 到手发现F1 F12的使用需要热键Fn的配合 xff0c 这对一个开发人员来说 xff0c 是件麻烦事儿 xff0c 解决方法如下 xff1a 重启电脑 xff0c Fn 43 F2 不停戳 进入B
  • LAMP和LNMP详解,面试必备

    LAMP简介 LAMP 是指一个集成开发环境 一般用来建立web应用平台 L Linux A Apache M Mysql P PHP或指Perl或指Python 1 Linux xff1a 是一个性能稳定的多用户网络操作系统 xff0c
  • 系统运行缓慢该怎么排查

    对于系统运行缓慢问题 xff0c 要分情况讨论 xff1a 如果该问题导致线上系统不可用 出现这种情况可能的原因主要有两种 xff1a 代码中某个位置读取数据量较大 xff0c 导致系统内存耗尽 xff0c 从而导致 Full GC 次数过
  • 编译安装Nginx步骤详解

    编译安装Nginx步骤详解 1 xff0c 去Nginx官方网站下载源码包并解压 curl O 或wget 跟下载链接 tar xf 解压 2 xff0c 进入nginx解压后的目录执行 configure configure prefix
  • python2和python3的差异,超详细总结

    python2与python3的区别 1 xff0c 市场差异 python2 xff1a 官方通知python2 2020开始不再维护 xff0c 但企业很多代码都是python2 python2有很大的用户基群故会出现历史遗留问题 xf
  • mysql学习笔记--主从复制

    主从复制简介 首先需要两台机器 xff0c 并且主从复制的前提是需要先做数据同步 xff0c 先在我的master机器上用mysqldump 将所有的数据备份 xff0c 然后scp传输到我的slave机器上 xff0c 然后在slave机
  • mysql学习笔记---sql语句

    基本select查询 1 xff0c 设置系统变量 64 64 sql mode xff0c 有一些限制规则 xff0c 日期不能为0 xff0c 除数不能为0 xff0c 自增不能从0开始 xff0c 授权用户密码不能为空 64 64 s
  • minikube 学习笔记 -- deployment 详解

    minikube 是什么 minikube 可以理解为一个可以运行在本地的 xff0c 单节点的 Kubernetes xff0c 我们可以通过在里面创建 Pods 来创建对应的服务 kubernetes 是什么 Kubernetes 是容