k8s系统笔记
补充
本来想结合项目的K8S实践写一篇完整的K8S的入门的。后来发现K8S官方的教程已经非常完美了,跑了官方的几个例子,感觉没有必要再狗尾续貂了。
强烈建议大家跟着K8S官方教程跑,跑的时候注意一下几点:
- minikube因为要翻墙的原因,初始化的时候不好搭建。建议翻墙不方便的同学用docker desktop kubernetes, 可以用下面的方法来启动。
- git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git
- git checkout v1.19.7
- ./load_images.sh
- https://blog.csdn.net/gzseehope/article/details/108881193
- 努力把kubernetes dashboard搭建起来,给自己一个感性的认识。
- minikube相关的内容直接跳过,我用的docker desktop kubernetes, 发现跳过minikube完全没有影响,大家不要受minikube干扰。
- 官方例子学习流程建议:
- 先学习hello node, 这里会学到基本的deployment和services两个概念。
- 再学习部署一个无状态应用
- 第三步学部署一个有状态单例应用, 这里会讲怎么做数据持久化
- 第四步学部署一个有状态有副本的应用, 这里会讲ConfigMap, StateSet, 动态扩容缩容, 给你插上挑战高并发的翅膀。
- 管理secrets。
- Config map
- [Ingress]
- Helm chart template
- K8S官方英文文档
- K8S官方中文文档
- 官方文档非常棒了,我确实没有必要继续浪费大家注意力了。
- 鉴于此,本文以记流水账为主,不以系统引导入门为目的。想讨论的小朋友可以在博客里找我微信加好友。
- Jenkins, ArgoCD, Helm, Rancher这些华丽的概念对于初学者来说完全没有必要去了解,浪费注意力。 并且它们确实不是必须的,都可以在初期舍弃,跟着官方文档跑就行。
- K8S挺复杂. 但是入门非常简单,我花了一天左右时间跑官方的例子,感觉挺顺利。
警告: deployment 在生产场景中并不适合,它使用单实例 WordPress 和 MySQL Pods。考虑使用 WordPress Helm Chart 在生产场景中部署 WordPress。
关于
记录某软件企业的k8s实践。 先罗列一下基本术语,后面按照术语逐步展开。
- K8S, 我们常说的云服务框架
- Docker, K8S是用来管理容器的, 常见的容器类型就是Docker container.
- Argocd, 用来处理Helm Charts. ArgoCD是一个专为Kubernetes而生,遵循GitOps理念的持续部署工具。这里指的Gitops简单来说就是
- 以Git为核心。
- 声明式定义各类对象。
- 配置一致性管理。
- 它集中于CD, 持续交付。
- CI有Jenkins来做。
- Jenkins, Jenkins是一款开源CI(Continuous Integration,持续集成)&CD(Continuous Delivery,持续交付)软件,用于自动化各种任务,包括构建、测试和部署软件,源码在https://github.com/jenkinsci/jenkins ,License为MIT.
- Vault, 一个存储secrets的工具,有商业版也有付费版。 HashiCorp出品.
- Consul, HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul的方案更”一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较 为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。
- Kubernetes-Dashboard, Kubernetes-Dashboard是官方的WEB UI,可以通过Dashboard查看集群信息,对容器服务进行故障管理、资源管理等。
- Rancher, Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。 由一下4部分组成:
- 基础设施编排, host资源管理。
- 容器编排与调度
- 应用商店。 Rancher的用户可以在应用商店里一键部署由多个容器组成的应用。用户可以管理这个部署的应用,并且可以在这个应用有新的可用版本时进行自动化的升级。Rancher提供了一个由Rancher社区维护的应用商店,其中包括了一系列的流行应用。Rancher的用户也可以创建自己的私有应用商店。
- 企业级权限管理。 支持Active Directory,LDAP, Github等 认证方式
- Rancher 为了支持多云管理(MeSos,Docker Swarm,Kubernetes等),引入了一系列复杂的概念,又需要新增安装 Rancher Server、Rancher Agent等,本来学习 Kubernetes 已然不堪重负,Rancher再把多云整合到一起来,无疑又增加了学习和使用的复杂性。如果您只是打算使用 Kubernetes 的话,也许并不需要选择 Rancher 这样重量级的产品。
- ingress, Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP. Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
- nip. 一个本地ip转化为公网ip的DNS服务, nip.io .
- Helm, Helm 是一个Kubernetes 应用的包管理工具,用来管理chart——预先配置好的安装包资源,有点类似于Ubuntu 的APT 和CentOS 中的YUM。
- Kubernetes Pod 是由一个或多个 为了管理和联网而绑定在一起的容器构成的组。
- Kubernetes Deployment 检查 Pod 的健康状况,并在 Pod 中的容器终止的情况下重新启动新的容器。 Deployment 是管理 Pod 创建和扩展的推荐方法。
- 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.
- 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系统主要有以下几步:
- 写Dockerfile, 用于构建docker container。保证本地能通过docker把服务器跑起来,这样才有可能通过k8s来大规模维护编排容器。
- 写Jenkins file, 用于在线自动构建image, 打tag.
- 创建Jenkins pipeline, 开启自动构建image, 打tag, 上传image的pipeline.
- 在Jenkins里面构建image, 打tag,上传image到docker registry.
- 写helm chart, 用来描述服务,配置参数.
- 去argo cd创建app, 用来发布和维护service.
- 每次Helm chart修改了以后需要去argo cd sync一下。 2.
- 去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/
- kubectl create deployment hello-node –image=k8s.gcr.io/echoserver:1.4 # 创建deployment
- kubectl get deployments # 查看部署情况
- kubectl get pods # 查看pods
- 使用 kubectl expose 命令将 Pod 暴露为service给公网:
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
- 如果是db, redis等这些不需要对外开放的应用,则不需要暴露为service.
- kubectl get services # 查看
- 打开http://localhost:8080, 可以看到返回的一段文本信息,server info.
- 一个服务部署成功. 从Kubernetes on Docker Examples开始。
里面包含了怎么启动Kubernetes docker for desktop.
Deloy一个无状态应用, nginx app.
https://kubernetes.io/zh/docs/tasks/run-application/run-stateless-application-deployment/
这个demo完成一下几件事情:
- 部署: 通过deployment文件创建一个nginx应用.
- 迭代: 通过更新deployment文件升级nginx版本。
- 扩容: 通过更新deployment文件部署多节点nginx。
- 对外暴露服务
部署: 通过deployment文件创建一个nginx应用.
- 通过 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
- 显示 Deployment 相关信息:
kubectl describe deployment nginx-deployment
- 列出 Deployment 创建的 Pods:
kubectl get pods -l app=nginx
- 展示某一个 Pod 信息:
kubectl describe pod <pod-name>
, 可以看到nginx版本为1.14.2Name: 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>
- 目前为止,只创建了deployment,没有暴露为service,所以nginx还只在kubernetes内部可用,不能外部访问。
迭代: 通过更新deployment文件升级nginx版本。
接下来升级nginx版本。 过程很简单,更新yaml文件里nginx的版本,然后重新apply一遍就可以了。
- 应用新的 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
- 查看该 Deployment 以新的名称创建 Pods 同时删除旧的 Pods:
kubectl get pods -l app=nginx
- 目前为止,我们成功升级了nginx的版本。这是非常重要的一个环节,就是我们开发中的版本迭代。可以看出来,步骤很简单,
- 每次改代码一个重新build image,
- 然后给image 打tag,
- 然后更新deployment文件里的image tag。
- 重新apply一下deployment文件,老的pods会被删除,然后生成新的pods。
- 当然,可以用来部署新版本,也可以用来版本回滚。
- 迭代有了。我们要扩容怎么办? 另外,服务还是没有暴露出来。
扩容: 通过更新deployment文件部署多节点nginx。
我们来尝试给nginx扩容. 给nginx扩容不一定好解释,我们可以假设nginx在这里代指一种web app, 它最多只能同时接受30个连接,双11来了,为了承受高并发,我们要能同时接受120个链接,那么我们就得起4个pods.
这也是kubernetes最核心的功能之一,按需扩容。
方法很简单, 修改yaml文件里的replicas为4, 指定该Depoyment有4个pods:
- 应用新的 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
- 验证 Deployment 有 4 个 Pods:
kubectl get pods -l app=nginx
对外暴露服务
- 列出所有的deployment:
kubectl get deployments
- 列出所有的服务:
kubectl get svc
- 暴露deployment, 通过port 80对外提供服务(其它端口不工作):
kubectl expose deployment nginx-deployment --type=LoadBalancer --port=80
- 查看服务是否暴露成功:
kubectl get svc
, 如果有nginx-deployment则表示服务暴露成功. - 浏览器打开 http://localhost:80, 查看nginx欢迎界面。
支持,一个无状态的kubernetes集群已经成功启动, 并且正常运行. 接下来可以研究怎么做有状态的应用, 也就是数据的持久化。
还可以仔细研读一下deployment文件的结构, 这个在后面会经常用到.
- 可以通过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
- 说明: 仅当 Deployment Pod 模板(即 .spec.template)发生改变时,例如模板的标签或容器镜像被更新, 才会触发 Deployment 上线。 其他更新(如对 Deployment 执行扩缩容的操作)不会触发上线动作。
- 查看上线状态:
kubectl rollout status deployment/nginx-deployment
- 查看所有历史版本replicaset:
kubectl get rs
, 查看所有历史版本。
Pod 模板
- .spec 中只有 .spec.template 和 .spec.selector 是必需的字段。
- .spec.template 是一个 Pod 模板。 它和 Pod 的语法规则完全相同。 只是这里它是嵌套的,因此不需要 apiVersion 或 kind。
运行一个单实例有状态应用
教程, https://kubernetes.io/zh/docs/tasks/run-application/run-single-instance-stateful-application/
目标
- 在你的环境中创建一个引用磁盘的 PersistentVolume
- 创建一个 MySQL Deployment.
- 在集群内以一个已知的 DNS 名称将 MySQL 暴露给其他 Pod
- 记住两个名词: PersistentVolumeClaim(PVC)和PersistentVolume(PV), 对应两种kind.
创建 PersistentVolumeClaim 之后,Kubernetes 控制平面将查找满足申领要求的 PersistentVolume。 如果控制平面找到具有相同 StorageClass 的适当的 PersistentVolume, 则将 PersistentVolumeClaim 绑定到该 PersistentVolume 上。配置 Pod 以使用 PersistentVolume 作为存储
- 部署 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
- 部署 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
~~~
- 展示 Deployment 相关信息:
kubectl describe deployment mysql
- 列举出 Deployment 创建的 pods:
kubectl get pods -l app=mysql
- 查看 PersistentVolumeClaim:
kubectl describe pvc mysql-pv-claim
- 查看PersistentVolume:
kubectl get pv
- 访问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 命令更新。 以下是特定于有状态应用的一些注意事项:
- 不要对应用进行规模扩缩。这里的设置仅适用于单实例应用。下层的 PersistentVolume 仅只能挂载到一个 Pod 上。对于集群级有状态应用,请参考 StatefulSet 文档.
- 在 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/
目标:
- 使用 StatefulSet 控制器部署多副本 MySQL 拓扑架构。
- 发送 MySQL 客户端请求
- 观察对宕机的抵抗力
- 扩缩 StatefulSet 的规模
看着好像比较激动人心!
引入了几个新的概念:
- ConfigMap.ConfigMap 本身没有什么特别之处,因而也不会出现不同部分应用于不同的 Pod 的情况。 每个 Pod 都会在初始化时基于 StatefulSet 控制器提供的信息决定要查看的部分。
-
StatefulSet
- 使用以下的 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
- 使用以下 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
~~~
- 最后,使用以下 YAML 配置文件创建 StatefulSet:
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-statefulset.yaml
- 你可以通过运行以下命令查看启动进度, 一段时间后,你应该看到所有 3 个 Pod 进入 Running 状态, Ctrl+C可以中断watch:
kubectl get pods -l app=mysql --watch
了解有状态的 Pod 初始化:
- StatefulSet 控制器按序数索引顺序地每次启动一个 Pod。 它一直等到每个 Pod 报告就绪才再启动下一个 Pod。
- 此外,控制器为每个 Pod 分配一个唯一、稳定的名称,形如
-<序数索引>, 其结果是 Pods 名为 mysql-0、mysql-1 和 mysql-2。序数索引> - 在启动 Pod 规约中的任何容器之前,Pod 首先按顺序运行所有的 Init 容器。
- 第一个名为 init-mysql 的 Init 容器根据序号索引生成特殊的 MySQL 配置文件。
- 该脚本通过从 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管理里面非常重要的一个工具或者概念。
用docker-compose搭建k8s系统
常用命令
安装docker desktop kubernetes,
- git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git
- git checkout v1.19.7
- ./load_images.sh
- https://blog.csdn.net/gzseehope/article/details/108881193
安装kubernetes metrics server
kubectl get deployment metrics-server -n kube-system
查看metrics server部署情况,kubectl logs deployment/metrics-server -n kube-system
查看日志。-
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
- brew install kubectl
- kubectl version –client
- kubectl cluster-info # 为了让 kubectl 能发现并访问 Kubernetes 集群,你需要一个 kubeconfig 文件, 该文件在 kube-up.sh 创建集群时,或成功部署一个 Miniube 集群时,均会自动生成。 通常,kubectl 的配置信息存放于文件 ~/.kube/config 中。通过获取集群状态的方法,检查是否已恰当的配置了 kubectl
- kubectl get namespace
- kubectl po -n mobile
- kubectl get po -n mobile
- kubectl exec -it mp-app-7cbb8cc9b9-bpktj -n mobile – sh
- kubectl cluster-info
- kubectl get po -A # list cluster 7.
- kubectl get nodes # 查看节点, 物理机.
- kubectl top pod -n mobile
- kubectl top node
- kubectl get pods
- kubectl get pods -l app=nginx # 获取app nginx的所有pods
- kubectl get deployments # 获取所有的deployments, 隐藏某些系统的deployments
- kubectl get deployments -A # 这个才是真正显示所有的deployment
- kubectl delete deployment nginx-deployment # 删除deployment nginx-deployment
- kubectl expose deployment hello-node –type=LoadBalancer –port=8080 # 把pod暴露为service, pod只能kubernetes集群内部访问, service可以外部访问。
- kubectl get services
- kubectl get svc # 和kubectl get services等价
- kubectl get pod,svc -n kube-system # 查看创建的Pod和Service
- kubectl delete service hello-node #清理service
- kubectl delete deployment hello-node #清理deployment
- kubectl create deployment kubernetes-bootcamp –image=gcr.io/google-samples/kubernetes-bootcamp:v1
- kubectl create deployment hello-node –image=k8s.gcr.io/echoserver:1.4
- kubectl get pods -n kube-system # parts of kubernetes system pods
- kubectl get pods –show-labels # 查看每个Pod自动生成的标签.
- kubectl describe pvc mysql-pv-claim #查看PersistentVolumeClaim
- kubectl describe pvc mysql-pv-claim # 查看PVC
- kubectl run -it –rm –image=mysql:5.6 –restart=Never mysql-client – mysql -h mysql -ppassword # 此命令在集群内创建一个新的 Pod 并运行 MySQL 客户端,并通过 Service 连接到服务器。 如果连接成功,你就知道有状态的 MySQL 数据库正处于运行状态。
- kubectl delete deployment,svc mysql
- kubectl delete pvc mysql-pv-claim
- kubectl delete pv mysql-pv-volume
- kubectl scale statefulset mysql –replicas=5 # 扩展副本数量, 扩容缩容都是这个命令
- kubectl get pods -l app=mysql –watch # 观察pods的复制初始化过程。
- kubectl get secrets
- kubectl delete secret db-user-pass
- kubectl create secret generic db-user-pass –from-file=./username.txt –from-file=./password.txt
- 通过docker-compose部署服务到本地k8s:
- export DOCKER_STACK_ORCHESTRATOR=kubernetes
- docker stack deploy voting-app -c docker-compose-k8s.yml
- failed to find a Stack API version
- https://github.com/docker/for-mac/issues/4966
-
$ kubectl api-versions grep compose - https://github.com/docker/compose-on-kubernetes, 已经被archived, 说明docker-compose file在kubernetes已经不推荐了。
- kubectl api-versions
- 创建helm chart template:
helm create mychartname
Dashboard
dashboard code: https://github.com/kubernetes/dashboard
- kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml # 部署dashboard
- kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml # 删除dashboard
- Alternatively, you can install Dashboard using Helm as described at https://artifacthub.io/packages/helm/k8s-dashboard/kubernetes-dashboard.
- start dashboard: kubectl proxy
-
get token: kubectl -n kube-system describe secret default awk ‘$1==”token:”{print $2}’ - dashboard访问地址: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
- local json data: http://127.0.0.1:8001
- error: no endpoints available for service "kubernetes-dashboard
- 查看pods状态: kubectl get pods –namespace kube-system
- 找到出错的pod,然后查看错误信息: `` 6.
kind
kind是本地做kubernetes部署的基于docker解决方案.
- brew install kind
- kind create cluster
- kind get kubeconfig-path # 查看kind config path
- docker ps
- kubectl describe node kind-control-plane # // 查看 node 的详细信息,可以看到 cni 为 containerd
- kind create cluster –name mohuishou
- kind get clusters
- kind delete cluster # 销毁集群
链接
- 基于Jenkins和Argocd实现CI/CD
- Kubernetes Docker Desktop example
- Example voting app
- Hello Kubernetes
- Hello mini kube
- 使用deployment运行一个无状态应用
- Running Kubernetes and the dashboard with Docker Desktop
- Kubernetes Metrics Server,
kubectl get deployment metrics-server -n kube-system
查看metrics server部署情况,kubectl logs deployment/metrics-server -n kube-system
查看日志。 - Kubernetes Dashboard
- Kubernetes客户端和管理界面大集合
- Hello Kubernetes!, 这个提供vs code extension support for local development env.
- Choosing a Local Dev Cluster, 怎样挑选本地kubernetes 环境。
- Docker samples, 下面包含example-voting-app和Docker Fifth Birthday
- 配置 Pod 以使用 PersistentVolume 作为存储, 有讲解PVC和PV之间怎么链接的。