欢迎转载,请支持原创,保留原文链接:blog.ilibrary.me

补充

本来想结合项目的K8S实践写一篇完整的K8S的入门的。后来发现K8S官方的教程已经非常完美了,跑了官方的几个例子,感觉没有必要再狗尾续貂了。

强烈建议大家跟着K8S官方教程跑,跑的时候注意一下几点:

  1. minikube因为要翻墙的原因,初始化的时候不好搭建。建议翻墙不方便的同学用docker desktop kubernetes, 可以用下面的方法来启动。
    1. git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git
    2. git checkout v1.19.7
    3. ./load_images.sh
    4. https://blog.csdn.net/gzseehope/article/details/108881193
  2. 努力把kubernetes dashboard搭建起来,给自己一个感性的认识。
  3. minikube相关的内容直接跳过,我用的docker desktop kubernetes, 发现跳过minikube完全没有影响,大家不要受minikube干扰。
  4. 官方例子学习流程建议:
    1. 先学习hello node, 这里会学到基本的deployment和services两个概念。
    2. 再学习部署一个无状态应用
    3. 第三步学部署一个有状态单例应用, 这里会讲怎么做数据持久化
    4. 第四步学部署一个有状态有副本的应用, 这里会讲ConfigMap, StateSet, 动态扩容缩容, 给你插上挑战高并发的翅膀。
    5. 管理secrets
    6. Config map
    7. [Ingress]
    8. Helm chart template
  5. K8S官方英文文档
  6. K8S官方中文文档
  7. 官方文档非常棒了,我确实没有必要继续浪费大家注意力了。
  8. 鉴于此,本文以记流水账为主,不以系统引导入门为目的。想讨论的小朋友可以在博客里找我微信加好友。
  9. Jenkins, ArgoCD, Helm, Rancher这些华丽的概念对于初学者来说完全没有必要去了解,浪费注意力。 并且它们确实不是必须的,都可以在初期舍弃,跟着官方文档跑就行。
  10. K8S挺复杂. 但是入门非常简单,我花了一天左右时间跑官方的例子,感觉挺顺利。

警告: deployment 在生产场景中并不适合,它使用单实例 WordPress 和 MySQL Pods。考虑使用 WordPress Helm Chart 在生产场景中部署 WordPress。

关于

记录某软件企业的k8s实践。 先罗列一下基本术语,后面按照术语逐步展开。

  1. K8S, 我们常说的云服务框架
  2. Docker, K8S是用来管理容器的, 常见的容器类型就是Docker container.
  3. Argocd, 用来处理Helm Charts. ArgoCD是一个专为Kubernetes而生,遵循GitOps理念的持续部署工具。这里指的Gitops简单来说就是
    1. 以Git为核心。
    2. 声明式定义各类对象。
    3. 配置一致性管理。
    4. 它集中于CD, 持续交付。
    5. CI有Jenkins来做。
  4. Jenkins, Jenkins是一款开源CI(Continuous Integration,持续集成)&CD(Continuous Delivery,持续交付)软件,用于自动化各种任务,包括构建、测试和部署软件,源码在https://github.com/jenkinsci/jenkins ,License为MIT.
  5. Vault, 一个存储secrets的工具,有商业版也有付费版。 HashiCorp出品.
  6. Consul, HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul的方案更”一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较 为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。
  7. Kubernetes-Dashboard, Kubernetes-Dashboard是官方的WEB UI,可以通过Dashboard查看集群信息,对容器服务进行故障管理、资源管理等。
  8. Rancher, Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。 由一下4部分组成:
    1. 基础设施编排, host资源管理。
    2. 容器编排与调度
    3. 应用商店。 Rancher的用户可以在应用商店里一键部署由多个容器组成的应用。用户可以管理这个部署的应用,并且可以在这个应用有新的可用版本时进行自动化的升级。Rancher提供了一个由Rancher社区维护的应用商店,其中包括了一系列的流行应用。Rancher的用户也可以创建自己的私有应用商店。
    4. 企业级权限管理。 支持Active Directory,LDAP, Github等 认证方式
  9. Rancher 为了支持多云管理(MeSos,Docker Swarm,Kubernetes等),引入了一系列复杂的概念,又需要新增安装 Rancher Server、Rancher Agent等,本来学习 Kubernetes 已然不堪重负,Rancher再把多云整合到一起来,无疑又增加了学习和使用的复杂性。如果您只是打算使用 Kubernetes 的话,也许并不需要选择 Rancher 这样重量级的产品。
  10. ingress, Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP. Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
  11. nip. 一个本地ip转化为公网ip的DNS服务, nip.io .
  12. Helm, Helm 是一个Kubernetes 应用的包管理工具,用来管理chart——预先配置好的安装包资源,有点类似于Ubuntu 的APT 和CentOS 中的YUM。
  13. Kubernetes Pod 是由一个或多个 为了管理和联网而绑定在一起的容器构成的组。
  14. Kubernetes Deployment 检查 Pod 的健康状况,并在 Pod 中的容器终止的情况下重新启动新的容器。 Deployment 是管理 Pod 创建和扩展的推荐方法。
  15. Kind, is a tool for running local Kubernetes clusters using Docker container “nodes”. kind was primarily designed for testing Kubernetes itself, but may be used for local development or CI.
  16. ConfigMap, 存储配置的地方。Consul和这有关。

架构

Docker, Docker-compose, Docker swarm和kubernetes

这里有一篇docker, docker-compose, docker swarm和kubernetes的比较。

简单一点讲, docker-compose, docker swarm和kubernetes都是docker容器编排工具。

docker-compose是单机版编排器, swarm和kubernetes是多机版容器编排工具。 docker swarm已经快被kubernetes干掉了。

流程

搭建k8s系统主要有以下几步:

  1. 写Dockerfile, 用于构建docker container。保证本地能通过docker把服务器跑起来,这样才有可能通过k8s来大规模维护编排容器。
  2. 写Jenkins file, 用于在线自动构建image, 打tag.
  3. 创建Jenkins pipeline, 开启自动构建image, 打tag, 上传image的pipeline.
  4. 在Jenkins里面构建image, 打tag,上传image到docker registry.
  5. 写helm chart, 用来描述服务,配置参数.
  6. 去argo cd创建app, 用来发布和维护service.
    1. 每次Helm chart修改了以后需要去argo cd sync一下。 2.
  7. 去rancher打开kubectl shell, 访问containers.

1-4是用Jenkins做CI, 5-6用ArgoCD做CD. 7是具体的运维了。

docker desktop kubernetes demo

Hello world, https://kubernetes.io/zh/docs/tutorials/hello-minikube/

  1. kubectl create deployment hello-node –image=k8s.gcr.io/echoserver:1.4 # 创建deployment
  2. kubectl get deployments # 查看部署情况
  3. kubectl get pods # 查看pods
  4. 使用 kubectl expose 命令将 Pod 暴露为service给公网: kubectl expose deployment hello-node --type=LoadBalancer --port=8080
  5. 如果是db, redis等这些不需要对外开放的应用,则不需要暴露为service.
  6. kubectl get services # 查看
  7. 打开http://localhost:8080, 可以看到返回的一段文本信息,server info.
  8. 一个服务部署成功. 从Kubernetes on Docker Examples开始。

里面包含了怎么启动Kubernetes docker for desktop.

Deloy一个无状态应用, nginx app.

https://kubernetes.io/zh/docs/tasks/run-application/run-stateless-application-deployment/

这个demo完成一下几件事情:

  1. 部署: 通过deployment文件创建一个nginx应用.
  2. 迭代: 通过更新deployment文件升级nginx版本。
  3. 扩容: 通过更新deployment文件部署多节点nginx。
  4. 对外暴露服务

部署: 通过deployment文件创建一个nginx应用.

  1. 通过 YAML 文件创建一个 Deployment:kubectl apply -f https://k8s.io/examples/application/deployment.yaml
     apiVersion: apps/v1
     kind: Deployment
     metadata:
     name: nginx-deployment
     spec:
     selector:
         matchLabels:
             app: nginx
     replicas: 2 # tells deployment to run 2 pods matching the template
     template:
         metadata:
             labels:
             app: nginx
         spec:
             containers:
             - name: nginx
             image: nginx:1.14.2
             ports:
             - containerPort: 80
    
    
  2. 显示 Deployment 相关信息: kubectl describe deployment nginx-deployment
  3. 列出 Deployment 创建的 Pods: kubectl get pods -l app=nginx
  4. 展示某一个 Pod 信息:kubectl describe pod <pod-name>, 可以看到nginx版本为1.14.2
     Name:         nginx-deployment-66b6c48dd5-2hx48
     Namespace:    default
     Priority:     0
     Node:         docker-desktop/192.168.65.4
     Start Time:   Sun, 15 Aug 2021 17:20:08 +0800
     Labels:       app=nginx
                     pod-template-hash=66b6c48dd5
     Annotations:  <none>
     Status:       Running
     IP:           10.1.0.12
     IPs:
     IP:           10.1.0.12
     Controlled By:  ReplicaSet/nginx-deployment-66b6c48dd5
     Containers:
     nginx:
         Container ID:   docker://d0eeeab9e8c45dff333308dd00d613b9e71f36cca6dbe0afebb2c0d2d6639db1
         Image:          nginx:1.14.2
         Image ID:       docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
         Port:           80/TCP
         Host Port:      0/TCP
         State:          Running
             Started:      Sun, 15 Aug 2021 17:21:12 +0800
         Ready:          True
         Restart Count:  0
         Environment:    <none>
         Mounts:
             /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-2wdml (ro)
     Conditions:
     Type              Status
     Initialized       True
     Ready             True
     ContainersReady   True
     PodScheduled      True
     Volumes:
     kube-api-access-2wdml:
         Type:                    Projected (a volume that contains injected data from multiple sources)
         TokenExpirationSeconds:  3607
         ConfigMapName:           kube-root-ca.crt
         ConfigMapOptional:       <nil>
         DownwardAPI:             true
     QoS Class:                   BestEffort
     Node-Selectors:              <none>
     Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                         node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
     Events:                      <none>
    
  5. 目前为止,只创建了deployment,没有暴露为service,所以nginx还只在kubernetes内部可用,不能外部访问。

迭代: 通过更新deployment文件升级nginx版本。

接下来升级nginx版本。 过程很简单,更新yaml文件里nginx的版本,然后重新apply一遍就可以了。

  1. 应用新的 YAML, nginx版本指定为1.16.1: kubectl apply -f https://k8s.io/examples/application/deployment-update.yaml
     apiVersion: apps/v1
     kind: Deployment
     metadata:
     name: nginx-deployment
     spec:
     selector:
         matchLabels:
             app: nginx
     replicas: 2
     template:
         metadata:
             labels:
             app: nginx
         spec:
             containers:
             - name: nginx
             image: nginx:1.16.1 # Update the version of nginx from 1.14.2 to 1.16.1
             ports:
             - containerPort: 80
    
    
  2. 查看该 Deployment 以新的名称创建 Pods 同时删除旧的 Pods: kubectl get pods -l app=nginx
  3. 目前为止,我们成功升级了nginx的版本。这是非常重要的一个环节,就是我们开发中的版本迭代。可以看出来,步骤很简单,
    1. 每次改代码一个重新build image,
    2. 然后给image 打tag,
    3. 然后更新deployment文件里的image tag。
    4. 重新apply一下deployment文件,老的pods会被删除,然后生成新的pods。
    5. 当然,可以用来部署新版本,也可以用来版本回滚。
  4. 迭代有了。我们要扩容怎么办? 另外,服务还是没有暴露出来。

扩容: 通过更新deployment文件部署多节点nginx。

我们来尝试给nginx扩容. 给nginx扩容不一定好解释,我们可以假设nginx在这里代指一种web app, 它最多只能同时接受30个连接,双11来了,为了承受高并发,我们要能同时接受120个链接,那么我们就得起4个pods.

这也是kubernetes最核心的功能之一,按需扩容。

方法很简单, 修改yaml文件里的replicas为4, 指定该Depoyment有4个pods:

  1. 应用新的 YAML 文件: kubectl apply -f https://k8s.io/examples/application/deployment-scale.yaml
     apiVersion: apps/v1
     kind: Deployment
     metadata:
     name: nginx-deployment
     spec:
     selector:
         matchLabels:
             app: nginx
     replicas: 4 # Update the replicas from 2 to 4
     template:
         metadata:
             labels:
             app: nginx
         spec:
             containers:
             - name: nginx
             image: nginx:1.14.2
             ports:
             - containerPort: 80
    
    
  2. 验证 Deployment 有 4 个 Pods: kubectl get pods -l app=nginx

对外暴露服务

  1. 列出所有的deployment: kubectl get deployments
  2. 列出所有的服务: kubectl get svc
  3. 暴露deployment, 通过port 80对外提供服务(其它端口不工作): kubectl expose deployment nginx-deployment --type=LoadBalancer --port=80
  4. 查看服务是否暴露成功: kubectl get svc, 如果有nginx-deployment则表示服务暴露成功.
  5. 浏览器打开 http://localhost:80, 查看nginx欢迎界面。

支持,一个无状态的kubernetes集群已经成功启动, 并且正常运行. 接下来可以研究怎么做有状态的应用, 也就是数据的持久化。

还可以仔细研读一下deployment文件的结构, 这个在后面会经常用到.

  1. 可以通过kubectl更新deployment nginx版本: kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1 或者 kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record
  2. 说明: 仅当 Deployment Pod 模板(即 .spec.template)发生改变时,例如模板的标签或容器镜像被更新, 才会触发 Deployment 上线。 其他更新(如对 Deployment 执行扩缩容的操作)不会触发上线动作。
  3. 查看上线状态: kubectl rollout status deployment/nginx-deployment
  4. 查看所有历史版本replicaset: kubectl get rs, 查看所有历史版本。

Pod 模板

  1. .spec 中只有 .spec.template 和 .spec.selector 是必需的字段。
  2. .spec.template 是一个 Pod 模板。 它和 Pod 的语法规则完全相同。 只是这里它是嵌套的,因此不需要 apiVersion 或 kind。

运行一个单实例有状态应用

教程, https://kubernetes.io/zh/docs/tasks/run-application/run-single-instance-stateful-application/

目标

  1. 在你的环境中创建一个引用磁盘的 PersistentVolume
  2. 创建一个 MySQL Deployment.
  3. 在集群内以一个已知的 DNS 名称将 MySQL 暴露给其他 Pod
  4. 记住两个名词: PersistentVolumeClaim(PVC)和PersistentVolume(PV), 对应两种kind.

创建 PersistentVolumeClaim 之后,Kubernetes 控制平面将查找满足申领要求的 PersistentVolume。 如果控制平面找到具有相同 StorageClass 的适当的 PersistentVolume, 则将 PersistentVolumeClaim 绑定到该 PersistentVolume 上。配置 Pod 以使用 PersistentVolume 作为存储

  1. 部署 YAML 文件中定义的 PV 和 PVC: kubectl apply -f https://k8s.io/examples/application/mysql/mysql-pv.yaml, 注意PVC和PV的’storageClassName’相同。
     apiVersion: v1
     kind: PersistentVolume
     metadata:
     name: mysql-pv-volume
     labels:
         type: local
     spec:
     storageClassName: manual
     capacity:
         storage: 20Gi
     accessModes:
         - ReadWriteOnce
     hostPath:
         path: "/mnt/data"
     ---
     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
     name: mysql-pv-claim
     spec:
     storageClassName: manual
     accessModes:
         - ReadWriteOnce
     resources:
         requests:
             storage: 20Gi
    
  2. 部署 YAML 文件中定义的 Deployment: kubectl apply -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml ~~~yaml apiVersion: v1 kind: Service metadata: name: mysql spec: ports:
    • port: 3306 selector: app: mysql clusterIP: None — apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - image: mysql:5.6 name: mysql env: # Use secret in real usage - name: MYSQL_ROOT_PASSWORD value: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv-claim

    ~~~

  3. 展示 Deployment 相关信息: kubectl describe deployment mysql
  4. 列举出 Deployment 创建的 pods: kubectl get pods -l app=mysql
  5. 查看 PersistentVolumeClaim: kubectl describe pvc mysql-pv-claim
  6. 查看PersistentVolume: kubectl get pv
  7. 访问mysql实例, kubectl run -it –rm –image=mysql:5.6 –restart=Never mysql-client – mysql -h mysql -ppassword # 此命令在集群内创建一个新的 Pod 并运行 MySQL 客户端,并通过 Service 连接到服务器。 如果连接成功,你就知道有状态的 MySQL 数据库正处于运行状态。-- mysql代表deployment mysql 8.

Deployment 中镜像或其他部分同往常一样可以通过 kubectl apply 命令更新。 以下是特定于有状态应用的一些注意事项:

  1. 不要对应用进行规模扩缩。这里的设置仅适用于单实例应用。下层的 PersistentVolume 仅只能挂载到一个 Pod 上。对于集群级有状态应用,请参考 StatefulSet 文档.
  2. 在 Deployment 的 YAML 文件中使用 strategy: type: Recreate。 该选项指示 Kubernetes 不 使用滚动升级。滚动升级无法工作,因为这里一次不能 运行多个 Pod。在使用更新的配置文件创建新的 Pod 前,Recreate 策略将 保证先停止第一个 Pod。

删除Deployment

通过名称删除部署的对象:

kubectl delete deployment,svc mysql
kubectl delete pvc mysql-pv-claim
kubectl delete pv mysql-pv-volume

运行一个有状态的应用程序

链接: https://kubernetes.io/zh/docs/tasks/run-application/run-replicated-stateful-application/

目标:

  1. 使用 StatefulSet 控制器部署多副本 MySQL 拓扑架构。
  2. 发送 MySQL 客户端请求
  3. 观察对宕机的抵抗力
  4. 扩缩 StatefulSet 的规模

看着好像比较激动人心!

引入了几个新的概念:

  1. ConfigMap.ConfigMap 本身没有什么特别之处,因而也不会出现不同部分应用于不同的 Pod 的情况。 每个 Pod 都会在初始化时基于 StatefulSet 控制器提供的信息决定要查看的部分。
  2. StatefulSet

  3. 使用以下的 YAML 配置文件创建 ConfigMap : kubectl apply -f https://k8s.io/examples/application/mysql/mysql-configmap.yaml
     apiVersion: v1
     kind: ConfigMap
     metadata:
     name: mysql
     labels:
         app: mysql
     data:
     master.cnf: |
         # Apply this config only on the master.
         [mysqld]
         log-bin
     slave.cnf: |
         # Apply this config only on slaves.
         [mysqld]
         super-read-only
    
    
    
  4. 使用以下 YAML 配置文件创建服务:kubectl apply -f https://k8s.io/examples/application/mysql/mysql-services.yaml ~~~yaml # Headless service for stable DNS entries of StatefulSet members. apiVersion: v1 kind: Service metadata: name: mysql labels: app: mysql spec: ports:
    • name: mysql port: 3306 clusterIP: None selector: app: mysql — # Client service for connecting to any MySQL instance for reads. # For writes, you must instead connect to the master: mysql-0.mysql. apiVersion: v1 kind: Service metadata: name: mysql-read labels: app: mysql spec: ports:
    • name: mysql port: 3306 selector: app: mysql

    ~~~

  5. 最后,使用以下 YAML 配置文件创建 StatefulSet: kubectl apply -f https://k8s.io/examples/application/mysql/mysql-statefulset.yaml
  6. 你可以通过运行以下命令查看启动进度, 一段时间后,你应该看到所有 3 个 Pod 进入 Running 状态, Ctrl+C可以中断watch:kubectl get pods -l app=mysql --watch

了解有状态的 Pod 初始化:

  1. StatefulSet 控制器按序数索引顺序地每次启动一个 Pod。 它一直等到每个 Pod 报告就绪才再启动下一个 Pod。
  2. 此外,控制器为每个 Pod 分配一个唯一、稳定的名称,形如 -<序数索引>, 其结果是 Pods 名为 mysql-0、mysql-1 和 mysql-2。
  3. 在启动 Pod 规约中的任何容器之前,Pod 首先按顺序运行所有的 Init 容器。
  4. 第一个名为 init-mysql 的 Init 容器根据序号索引生成特殊的 MySQL 配置文件。
  5. 该脚本通过从 Pod 名称的末尾提取索引来确定自己的序号索引,而 Pod 名称由 hostname 命令返回。 然后将序数(带有数字偏移量以避免保留值)保存到 MySQL conf.d 目录中的文件 server-id.cnf。 这一操作将 StatefulSet 所提供的唯一、稳定的标识转换为 MySQL 服务器的 ID, 而这些 ID 也是需要唯一性、稳定性保证的。 5.

上述 StatefulSet 清单中的 Pod 模板利用这些属性来执行 MySQL 副本的有序启动。

创建测试查询:

kubectl run mysql-client --image=mysql:5.7 -i --rm --restart=Never --\
  mysql -h mysql-0.mysql <<EOF
CREATE DATABASE test;
CREATE TABLE test.messages (message VARCHAR(250));
INSERT INTO test.messages VALUES ('hello');
EOF

使用主机名 mysql-read 将测试查询发送到任何报告为就绪的服务器:

kubectl run mysql-client --image=mysql:5.7 -i -t --rm --restart=Never --\
  mysql -h mysql-read -e "SELECT * FROM test.messages"

为了演示 mysql-read 服务在服务器之间分配连接,你可以在循环中运行 SELECT @@server_id:

kubectl run mysql-client-loop --image=mysql:5.7 -i -t --rm --restart=Never --\
  bash -ic "while sleep 1; do mysql -h mysql-read -e 'SELECT @@server_id,NOW()'; done"

你应该看到报告的 @@server_id 发生随机变化,因为每次尝试连接时都可能选择了不同的端点

如果删除了 Pod,则 StatefulSet 还会重新创建 Pod,类似于 ReplicaSet 对无状态 Pod 所做的操作。 kubectl delete pod mysql-2

扩展副本节点数量:kubectl scale statefulset mysql --replicas=5

Voting kubernetes.

Helm 入门

Helm Chart是K8S管理里面非常重要的一个工具或者概念。

Helm入门

用docker-compose搭建k8s系统

常用命令

安装docker desktop kubernetes,

  1. git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git
  2. git checkout v1.19.7
  3. ./load_images.sh
  4. https://blog.csdn.net/gzseehope/article/details/108881193

安装kubernetes metrics server

  1. kubectl get deployment metrics-server -n kube-system 查看metrics server部署情况,
  2. kubectl logs deployment/metrics-server -n kube-system查看日志。
    1. https://stackoverflow.com/questions/64767239/kubernetes-metrics-server-not-running, fix self-signed certificates issue. download https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml and add args for insecure-tls, then apply it in kubectl. It is in the kind: Deployment part, Path: spec template spec containers args and is a line like this “- –kubelet-insecure-tls”.

Kubectl

  1. brew install kubectl
  2. kubectl version –client
  3. kubectl cluster-info # 为了让 kubectl 能发现并访问 Kubernetes 集群,你需要一个 kubeconfig 文件, 该文件在 kube-up.sh 创建集群时,或成功部署一个 Miniube 集群时,均会自动生成。 通常,kubectl 的配置信息存放于文件 ~/.kube/config 中。通过获取集群状态的方法,检查是否已恰当的配置了 kubectl
  4. kubectl get namespace
  5. kubectl po -n mobile
  6. kubectl get po -n mobile
  7. kubectl exec -it mp-app-7cbb8cc9b9-bpktj -n mobile – sh
  8. kubectl cluster-info
  9. kubectl get po -A # list cluster 7.
  10. kubectl get nodes # 查看节点, 物理机.
  11. kubectl top pod -n mobile
  12. kubectl top node
  13. kubectl get pods
  14. kubectl get pods -l app=nginx # 获取app nginx的所有pods
  15. kubectl get deployments # 获取所有的deployments, 隐藏某些系统的deployments
  16. kubectl get deployments -A # 这个才是真正显示所有的deployment
  17. kubectl delete deployment nginx-deployment # 删除deployment nginx-deployment
  18. kubectl expose deployment hello-node –type=LoadBalancer –port=8080 # 把pod暴露为service, pod只能kubernetes集群内部访问, service可以外部访问。
  19. kubectl get services
  20. kubectl get svc # 和kubectl get services等价
  21. kubectl get pod,svc -n kube-system # 查看创建的Pod和Service
  22. kubectl delete service hello-node #清理service
  23. kubectl delete deployment hello-node #清理deployment
  24. kubectl create deployment kubernetes-bootcamp –image=gcr.io/google-samples/kubernetes-bootcamp:v1
  25. kubectl create deployment hello-node –image=k8s.gcr.io/echoserver:1.4
  26. kubectl get pods -n kube-system # parts of kubernetes system pods
  27. kubectl get pods –show-labels # 查看每个Pod自动生成的标签.
  28. kubectl describe pvc mysql-pv-claim #查看PersistentVolumeClaim
  29. kubectl describe pvc mysql-pv-claim # 查看PVC
  30. kubectl run -it –rm –image=mysql:5.6 –restart=Never mysql-client – mysql -h mysql -ppassword # 此命令在集群内创建一个新的 Pod 并运行 MySQL 客户端,并通过 Service 连接到服务器。 如果连接成功,你就知道有状态的 MySQL 数据库正处于运行状态。
  31. kubectl delete deployment,svc mysql
  32. kubectl delete pvc mysql-pv-claim
  33. kubectl delete pv mysql-pv-volume
  34. kubectl scale statefulset mysql –replicas=5 # 扩展副本数量, 扩容缩容都是这个命令
  35. kubectl get pods -l app=mysql –watch # 观察pods的复制初始化过程。
  36. kubectl get secrets
  37. kubectl delete secret db-user-pass
  38. kubectl create secret generic db-user-pass –from-file=./username.txt –from-file=./password.txt
  39. 通过docker-compose部署服务到本地k8s:
    1. export DOCKER_STACK_ORCHESTRATOR=kubernetes
    2. docker stack deploy voting-app -c docker-compose-k8s.yml
    3. failed to find a Stack API version
      1. https://github.com/docker/for-mac/issues/4966
      2. $ kubectl api-versions grep compose
      3. https://github.com/docker/compose-on-kubernetes, 已经被archived, 说明docker-compose file在kubernetes已经不推荐了。
  40. kubectl api-versions
  41. 创建helm chart template: helm create mychartname

Dashboard

dashboard code: https://github.com/kubernetes/dashboard

  1. kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml # 部署dashboard
  2. kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml # 删除dashboard
  3. Alternatively, you can install Dashboard using Helm as described at https://artifacthub.io/packages/helm/k8s-dashboard/kubernetes-dashboard.
  4. start dashboard: kubectl proxy
  5. get token: kubectl -n kube-system describe secret default awk ‘$1==”token:”{print $2}’
  6. dashboard访问地址: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
  7. local json data: http://127.0.0.1:8001
  8. error: no endpoints available for service "kubernetes-dashboard
    1. 查看pods状态: kubectl get pods –namespace kube-system
    2. 找到出错的pod,然后查看错误信息: `` 6.

kind

kind是本地做kubernetes部署的基于docker解决方案.

  1. brew install kind
  2. kind create cluster
  3. kind get kubeconfig-path # 查看kind config path
  4. docker ps
  5. kubectl describe node kind-control-plane # // 查看 node 的详细信息,可以看到 cni 为 containerd
  6. kind create cluster –name mohuishou
  7. kind get clusters
  8. kind delete cluster # 销毁集群

链接

  1. 基于Jenkins和Argocd实现CI/CD
  2. Kubernetes Docker Desktop example
  3. Example voting app
  4. Hello Kubernetes
  5. Hello mini kube
  6. 使用deployment运行一个无状态应用
  7. Running Kubernetes and the dashboard with Docker Desktop
  8. Kubernetes Metrics Server, kubectl get deployment metrics-server -n kube-system 查看metrics server部署情况, kubectl logs deployment/metrics-server -n kube-system查看日志。
  9. Kubernetes Dashboard
  10. Kubernetes客户端和管理界面大集合
  11. Hello Kubernetes!, 这个提供vs code extension support for local development env.
  12. Choosing a Local Dev Cluster, 怎样挑选本地kubernetes 环境。
  13. Docker samples, 下面包含example-voting-appDocker Fifth Birthday
  14. 配置 Pod 以使用 PersistentVolume 作为存储, 有讲解PVC和PV之间怎么链接的。