安装支持
https://github.com/AliyunContainerService/k8s-for-docker-desktop
相关工具
kuboard
https://github.com/lima-vm/lima
kind - 快速启动k8s集群
集群配置
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30080
hostPort: 30080
- role: worker
- role: worker
使用
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.10.0/kind-darwin-amd64
chmod +x ./kind
kind build node-image
kind create cluster
kind create cluster --name mydlqcloud --config kind.config
kind create cluster --image kindest/node:latest # 指定版本创建集群kindest/node:v1.20.2
kind delete cluster --name mydlqcloud # 删除集群
kind delete clusters –all #删除所有集群
kind get clusters
kubectl config get-contexts #所有可用的上下文
kubectl config set-context kind-kind #为kubectl设置上下文
kubectl get nodes #查看集群节点
kubectl create namespace mydlqcloud # 创建namespace
#ErrImageNeverPull 加载本地镜像到集群,然后image添加属性imagePullPolicy: Never
kind load docker-image qizai/ops-admin-k8s:0.0.2 --name mydlqcloud
kubectl get service -n mydlqcloud
kubectl get pods -n mydlqcloud
kubectl get deployment -n mydlqcloud
kubectl get deploy,rs,po,svc -o wide -n mydlqcloud
kubectl get nodes -n mydlqcloud
kubectl describe nodes mydlqcloud-control-plane -n mydlqcloud
kubectl api-versions
kubectl get nodes -n mydlqcloud
# 扩容
方式一:kubectl scale deploy deploy名称 --replicas=pod数量 -n 命名空间
方式二:kubectl edit deploy deploy名字 -n 命名空间
# 切换集群
kubectl cluster-info --context kind-kind
# 部署
kubectl apply -f ops-admin-k8s.yaml -n mydlqcloud
# 删除
kubectl delete -f ops-admin-k8s.yaml -n mydlqcloud
# 查看资源
kubectl get deploy,rs,po,svc -o wide -n mydlqcloud
# 进入pod
kubectl exec -it [PodID] -n [NS] /bin/bash
# 查看日志
kubectl logs springboot-admin-k8s-7f988cdf68-q2p8q --previous -n mydlqcloud
#
kubectl create deployment demo --image=springguides/demo --dry-run -o=yaml > deployment.yaml
echo --- >> deployment.yaml
kubectl create service clusterip demo --tcp=8080:8080 --dry-run -o=yaml >> deployment.yaml
kubectl apply -f deployment.yaml
kubectl port-forward svc/demo 8080:8080
minikube
https://github.com/kubernetes/minikube
lens
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。
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: #基本要求
limits: # 不能超过memory: "1024Mi" cpu: "1000m"
memory: "4096Mi" cpu: "2000m"
- name: nginx
image: nginx
resources: # 资源声明
requests: #基本要求
<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