minikube 是什么 minikube 可以理解为一个可以运行在本地的,单节点的 Kubernetes ,我们可以通过在里面创建 Pods 来创建对应的服务
kubernetes 是什么 Kubernetes 是容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
minikube 安装 MAC
Linux 1 2 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube
详细安装见 官方文档
查看安装是否成功 1 2 3 ➜ ~ minikube version minikube version: v1.17.1 commit: 043bdca07e54ab6e4fc0457e3064048f34133d7e
minikube 环境搭建
启动 minikube
1 2 3 4 5 6 7 8 9 ➜ ~ 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 相关命令
1 2 3 ➜ ~ kubectl get node NAME STATUS ROLES AGE VERSION minikube Ready control-plane,master 149m v1.20.2
部署应用
1 2 3 4 5 #创建一个名为 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 是否创建成功
1 kubectl get services hello-minikube
访问 service
1 minikube service hello-minikube
Loadbalancer 部署
1 2 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
1 minikube dashboard --url
直接跳转
1 2 3 4 5 ➜ ~ 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 官方介绍
Deployment 为 Pod 和 Replica Set 提供声明式更新。 我们只需要在 Deployment 中描述想要的目标状态是什么,Deployment Controller 就会帮我们将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。
具体表现为
定义一组 Pod 期望数量,Deployment Controller 会维持 Pod 数量与期望数量一致 配置 Pod 的发布方式,Deployment Controller 会按照给定的策略更新 Pod,保证更新过程中不可用 Pod 维持在限定数量范围内 如果发布有问题支持回滚
deployment 原理
Kubernetes 中有一个 kube-controller-manager 的组件,是控制器的集合,每一个控制器负责某种编排功能,deployment 是控制器中的一种
可以简单的这样描述:
1 2 3 4 5 6 7 8 9 for { 实际状态 := 获取集群中对象X的实际状态 期望状态 := 获取集群中对象X的期望状态 if 实际状态 == 期望状态 { 什么都不做 }else{ 执行编排动作,将实际状态调整为期望状态 } }
实际状态:往往来自于 Kubernetes 集群本身。比如 Kubelet 通过心跳汇报的容器状态和节点状态,或者监控系统中保存的应用监控数据,或者控制器主动收集的它感兴趣的信息,这些都是常见的实际状态的来源; 期望状态:一般来自用户提交的 YAML 文件,这些信息都保存在 Etcd 中
例如:
Deployment Controller 会从 Etcd 中获取到所有携带 “app:xxx”标签的 Pod,然后统计它们的数量,这是实际状态
Deployment 对象的 replicas 的值是期望状态 Deployment
Controller 会将两个状态做比较,然后根据比较结果,确定是创建新的 Pod,还是删除已有 Pod
deployment 实验练习
编写 yaml 文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ➜ 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
1 2 ➜ kubectl create -f deploy_nginx.yml deployment.apps/nginx-deployment created
查看 deployment 的创建情况
1 2 3 4 5 ➜ 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 的创建需要一些时间
1 2 3 4 5 ➜ 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
1 2 3 4 5 6 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 信息
1 2 3 4 5 6 7 ➜ 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 的详细信息
1 2 3 4 5 ➜ 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
暴露端口
1 2 ➜ kubectl expose deployment nginx-deployment --type=NodePort service/nginx-deployment exposed
可看到暴露的端口为 31895
1 2 3 4 5 6 ➜ 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 地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ➜ 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
访问成功
1 2 3 4 5 6 7 8 9 10 11 12 13 14 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 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