安装支持

https://github.com/AliyunContainerService/k8s-for-docker-desktop

相关工具

kuboard

https://kuboard.cn/

https://github.com/lima-vm/lima

kind - 快速启动k8s集群

https://kind.sigs.k8s.io/

集群配置

  1. apiVersion: kind.x-k8s.io/v1alpha4
  2. kind: Cluster
  3. nodes:
  4. - role: control-plane
  5. extraPortMappings:
  6. - containerPort: 30080
  7. hostPort: 30080
  8. - role: worker
  9. - role: worker

使用

  1. curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.10.0/kind-darwin-amd64
  2. chmod +x ./kind
  3. kind build node-image
  4. kind create cluster
  5. kind create cluster --name mydlqcloud --config kind.config
  6. kind create cluster --image kindest/node:latest # 指定版本创建集群kindest/node:v1.20.2
  7. kind delete cluster --name mydlqcloud # 删除集群
  8. kind delete clusters all #删除所有集群
  9. kind get clusters
  10. kubectl config get-contexts #所有可用的上下文
  11. kubectl config set-context kind-kind #为kubectl设置上下文
  12. kubectl get nodes #查看集群节点
  13. kubectl create namespace mydlqcloud # 创建namespace
  14. #ErrImageNeverPull 加载本地镜像到集群,然后image添加属性imagePullPolicy: Never
  15. kind load docker-image qizai/ops-admin-k8s:0.0.2 --name mydlqcloud
  16. kubectl get service -n mydlqcloud
  17. kubectl get pods -n mydlqcloud
  18. kubectl get deployment -n mydlqcloud
  19. kubectl get deploy,rs,po,svc -o wide -n mydlqcloud
  20. kubectl get nodes -n mydlqcloud
  21. kubectl describe nodes mydlqcloud-control-plane -n mydlqcloud
  22. kubectl api-versions
  23. kubectl get nodes -n mydlqcloud
  24. # 扩容
  25. 方式一:kubectl scale deploy deploy名称 --replicas=pod数量 -n 命名空间
  26. 方式二:kubectl edit deploy deploy名字 -n 命名空间
  27. # 切换集群
  28. kubectl cluster-info --context kind-kind
  29. # 部署
  30. kubectl apply -f ops-admin-k8s.yaml -n mydlqcloud
  31. # 删除
  32. kubectl delete -f ops-admin-k8s.yaml -n mydlqcloud
  33. # 查看资源
  34. kubectl get deploy,rs,po,svc -o wide -n mydlqcloud
  35. # 进入pod
  36. kubectl exec -it [PodID] -n [NS] /bin/bash
  37. # 查看日志
  38. kubectl logs springboot-admin-k8s-7f988cdf68-q2p8q --previous -n mydlqcloud
  39. #
  40. kubectl create deployment demo --image=springguides/demo --dry-run -o=yaml > deployment.yaml
  41. echo --- >> deployment.yaml
  42. kubectl create service clusterip demo --tcp=8080:8080 --dry-run -o=yaml >> deployment.yaml
  43. kubectl apply -f deployment.yaml
  44. kubectl port-forward svc/demo 8080:8080

minikube

https://github.com/kubernetes/minikube

lens

https://k8slens.dev/

k9s

helm:用于kubernetes的包管理器

可以将Helm看作Kubernetes下的apt-get/yum

术语-Helm

Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。

术语-Tiller

Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。

术语-Chart

Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。

术语-Repoistory

Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。

术语-Release

使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。

image.png

RBAC的三个基本概念:
Subject:被作用者,它表示k8s中的三类主体, user, group, serviceAccount
Role:角色,它其实是一组规则,定义了一组对 Kubernetes API 对象的操作权限。
RoleBinding:定义了“被作用者”和“角色”的绑定关系。
Role 和 ClusterRole

Role是一系列的权限的集合,Role只能授予单个namespace 中资源的访问权限。
ClusterRole 跟 Role 类似,但是可以在集群中全局使用。
RoleBinding和ClusterRoleBinding

RoleBinding是将Role中定义的权限授予给用户或用户组。它包含一个subjects列表(users,groups,service accounts),并引用该Role。
RoleBinding是对某个namespace 内授权,ClusterRoleBinding适用在集群范围内使用。
[

](https://blog.csdn.net/qq_35887546/article/details/105998194)
服务账户准入控制器(Service account admission controller)

如果该 pod 没有 ServiceAccount 设置,将其 ServiceAccount 设为 default。
保证 pod 所关联的 ServiceAccount 存在,否则拒绝该 pod。
如果 pod 不包含 ImagePullSecrets 设置,那么 将 ServiceAccount 中的 ImagePullSecrets 信息添加到 pod 中。
将一个包含用于 API 访问的 token 的 volume 添加到 pod 中。
将挂载于 /var/run/secrets/kubernetes.io/serviceaccount 的 volumeSource 添加到 pod 下的每个容器中。
[

](https://blog.csdn.net/qq_35887546/article/details/105998194)

Tekton:持续集成和交付(CI/CD)系统

Tekton 是一个功能强大且灵活的Kubernetes 原生开源框架,用于创建持续集成和交付(CI/CD)系统

Istio:Service Mesh(服务网格)框架,解决是应用的服务(流量)治理问题

Istio 提供一种简单的方式来为已部署的服务建立网络,该网络具有负载均衡、服务间认证、监控等功能,而不需要对服务的代码做任何改动
主要功能:

  • 连接(Connect):智能控制服务之间的调用流量,能够实现灰度升级、AB 测试和红黑部署等功能
  • 安全加固(Secure):自动为服务之间的调用提供认证、授权和加密。
  • 控制(Control):应用用户定义的 policy,保证资源在消费者中公平分配。
  • 观察(Observe):查看服务运行期间的各种数据,比如日志、监控和 tracing,了解服务的运行情况。

术语-Sidecar 模式

将应用程序的功能划分为单独的进程可以被视为 Sidecar 模式。Sidecar 设计模式允许你为应用程序添加许多功能,而无需额外第三方组件的配置和代码。

环境要求(建议4核8G)

Master

节点规模 Master规格
1~5个节点 4核8G(不建议2核4G)
6~20个节点 4核16G
21~100个节点 8核32G
100~200个节点 16核64G

Worker

vCPU 可用容忍度 机器
160 10 10台16CPU
  • 确定整个集群的日常使用的总核数以及可用度的容忍度。
    例如:集群总的核数有160核,可以容忍10%的错误。那么最小选择10台16核ECS,并且高峰运行的负荷不要超过16090%=144核。如果容忍度是20%,那么最小选择5台32核ECS,并且高峰运行的负荷不要超过16080%=128核。这样就算有一台ECS出现故障,剩余ECS仍可以支持现有业务正常运行。
  • 确定CPU:Memory比例。对于使用内存比较多的应用例如Java类应用,建议考虑使用1:8的机型。

生产环境高可用

磁盘-推荐SSD盘

  • 对于Worker节点,创建集群时推荐选择挂载数据盘。该数据盘用于供/var/lib/docker存放本地镜像,避免后续镜像过多导致根磁盘容量不够的问题。在运行一段时间后,本地可能存在很多无用的镜像,快速解决该问题的方法是先下线这台机器,重新构建数据盘后再上线。
  • 磁盘大小:Docker镜像、系统日志、应用日志都保存在磁盘上。创建Kubernetes集群的时候,要考虑每个节点上要部署的Pod数量,每个Pod的日志大小、镜像大小、临时数据,再加上一些系统预留的值。
  • Kubernetes集群中,ECS操作系统占用3G左右的磁盘空间,建议预留ECS操作系统8G的空间。剩余的磁盘空间由Kubernetes资源对象使用。

    网络选择

  • Flannel:使用的是简单稳定的社区的FlannelCNI插件,配合阿里云的VPC的高速网络,能给集群高性能和稳定的容器网络体验,但功能偏简单,支持的特性少。例如,不支持基于Kubernetes标准的Network Policy。

  • Terway:是阿里云容器服务Kubernetes版自研的网络插件,将阿里云的弹性网卡分配给容器,支持基于Kubernetes标准的Network Policy来定义容器间的访问策略,支持对单个容器做带宽的限流。对于不需要使用Network Policy的用户,可以选择Flannel,其他情况建议选择Terway。
  • Pod网络CIDR不能设置太小,如果太小,可支持的节点数量就会受限。这个值的设置需要与高级选项中的节点Pod数量综合考虑。例如:Pod网络CIDR的网段是/16,那么就有256*256个地址,如果每个节点Pod数量是128,则最多可以支持512个节点。

    声明每个Pod的resource

    Kubernetes采用静态资源调度方式,对于每个节点上的剩余资源,它是这样计算的:节点剩余资源=节点总资源-已经分配出去的资源,并不是实际使用的资源 ```bash apiVersion: v1 kind: Pod metadata: name: nginx spec: containers:
    • name: nginx image: nginx resources: # 资源声明 requests: #基本要求
      memory: "1024Mi"
      cpu: "1000m"
      
      limits: # 不能超过
      memory: "4096Mi"
      cpu: "2000m"
      
<a name="nJHoG"></a>
#### 启动时等待下游服务,不要直接退出
Kubernetes的最好的做法是启动时检查依赖,如果不满足,轮询等待,而不是直接退出。可以通过[Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/?spm=a2c4g.11186623.2.21.687e1c9bRJfGTw#what-can-init-containers-be-used-for)完成这个功能。

<a name="FFPq6"></a>
#### 配置restart policy、Liveness Probe和Readiness Probe
restartPolicy有三个可选值:

- Always: 总是自动重启。
- OnFailure:异常退出才自动重启 (进程退出状态非0)。
- Never:从不重启。

Liveness Probe,探测Pod是否真的存活,是否还能提供服务。如果Liveness Probe发现了问题,Kubernetes会重启Pod。<br />Readiness Probe用于探测Pod是不是可以对外提供服务。应用启动过程中需要一些时间完成初始化,在这个过程中是没法对外提供服务的,通过Readiness Probe,可以告诉Ingress或者Service能不能把流量转发到这个Pod上。当Pod出现问题的时候,Readiness Probe能避免新流量继续转发到这个Pod。
```bash
apiVersion: v1
kind: Pod
metadata:
  name: tomcat
spec:
  containers:
  - name: tomcat
    image: tomcat
    restartPolicy: OnFailure # 重启规则
    livenessProbe: # 是否存活
      httpGet:
        path: /index.jsp
        port: 8080
      initialDelaySeconds: 3
      periodSeconds: 3
    readinessProbe: # 是否启动完毕
      httpGet:
        path: /index.jsp
        port: 8080

快速安装

git clone https://github.com/hummerstudio/k8s-docker-desktop-for-mac.git cd k8s-docker-desktop-for-mac _sh _load_images.sh

安装控制台

kubectl apply -f kubernetes-dashboard.yaml
# 开启 API Server 访问代理
kubectl proxy
# 获取token用于登录使用
kubectl -n kube-system describe secret default| awk '$1=="token:"{print $2}'

状态验证

# 验证 Kubernetes 集群状态
kubectl cluster-info
kubectl get nodes
kubectl describe node

# 可选操作: 切换Kubernetes运行上下文至 docker-for-desktop
kubectl config use-context docker-for-desktop

获取pod/登录pod

kubectl -n intbee get pod kubectl -n intbee exec -it [ID] bash