以上展示了一个 master(主节点)和 6 个 worker(工作节点)的 k8s 集群
# docker run --name hello-pod alpine 是跑一个容器,容器的粒度有点小kubectl run hello-pod --image=alpine #跑一个Pod。Pod里面其实也是容器 kubectl get pod #以前的docker ps -a## 所有kubectl在master节点运行,把命令请求发给api-server。api-server一系列处理## master只负责调度,而worker node才是真正部署应用的。
docker 是每一个 worker 节点的运行时环境
kubelet 负责控制所有容器的启动停止,保证节点工作正常,已经帮助节点交互 master
master 节点的关键组件:
worker 节点:
创建一次部署工作(自愈机制)
# kubectl create 帮我们创建k8s集群中的一些对象kubectl create --helpkubectl create deployment 这次部署的名字 --image=应用的镜像#Create a deployment named my-nginx that runs the nginx imagekubectl create deployment my-nginx --image=nginx##最终在一个机器上有pod、这个pod其实本质里面就是一个容器k8s_nginx_my-nginx-6b74b79f57-snlr4_default_dbeac79e-1ce9-42c9-bc59-c8ca0412674b_0### k8s_镜像(nginx)_pod名(my-nginx-6b74b79f57-snlr4)_容器名(default_dbeac79e-1ce9-42c9-bc59-c8ca0412674b_0)# Create a deployment with commandkubectl create deployment my-nginx --image=nginx -- date# Create a deployment named my-nginx that runs the nginx image with 3 replicas.kubectl create deployment my-nginx --image=nginx --replicas=3# Create a deployment named my-nginx that runs the nginx image and expose port 80.kubectl create deployment my-nginx --image=nginx --port=80
Deployment(部署)
自愈:针对使用 Deployment 等部署的应用。
kubectl run :直接启动一个 pod; 不会产生一次部署信息。所以删除就没
kubectl create deploy: 启动一个 Pod,以及记录这次部署信息。所以,这个 pod 即使挂了,这次部署信息有,就会强制同步到这次部署信息期望的最终结果;kubectl get deploy,pod 都有内容
创建 Deployment 后,k8s 创建了一个 Pod(容器组) 来放置应用程序实例(container 容器)。
Pod (容器组) 是一个 k8s 中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容器,即图上正方体),以及这些 container (容器)的一些共享资源。这些资源包括:
Pod(容器组)是 k8s 集群上的最基本的单元。当我们在 k8s 上创建 Deployment 时,会在集群上创建包含容器的 Pod (而不是直接创建容器)。每个 Pod 都与运行它的 worker 节点(Node)绑定,并保持在那里直到终止或被删除。如果节点(Node)发生故障,则会在群集中的其他可用节点(Node)上运行相同的 Pod(从同样的镜像创建 Container,使用同样的配置,IP 地址不同,Pod 名字不同)。
TIP 重要:
Pod(容器组)总是在 Node(节点) 上运行。Node(节点)是 kubernetes 集群中的计算机,可以是虚拟机或物理机。每个 Node(节点)都由 master 管理。一个 Node(节点)可以有多个 Pod(容器组),kubernetes master 会根据每个 Node(节点)上可用资源的情况,自动调度 Pod(容器组)到最佳的 Node(节点)上。
每个 Kubernetes Node(节点)至少运行:
Kubelet 启动的 Pod 每个都有 Ip,全集群任意位置均可访问
kubeadm init \--apiserver-advertise-address=10.170.11.8 \--image-repository registry.cn-hangzhou.aliyuncs.com/lanson_k8s_images \--kubernetes-version v1.21.0 \--service-cidr=10.96.0.0/16 \--pod-network-cidr=192.168.0.0/16--pod-network-cidr=192.168.0.0/16:pod 的ip范围
calico:网络组件: 【扁平化网络】
kubectl get - 显示资源列表
# kubectl get 资源类型#获取类型为Deployment的资源列表kubectl get deployments#获取类型为Pod的资源列表kubectl get pods#获取类型为Node的资源列表kubectl get nodes
# 查看所有名称空间的 Deploymentkubectl get deployments -Akubectl get deployments --all-namespaces# 查看 kube-system 名称空间的 Deploymentkubectl get deployments -n kube-system
#####并不是所有的对象都在名称空间中# 在名称空间里kubectl api-resources --namespaced=true# 不在名称空间里kubectl api-resources --namespaced=false
kubectl describe - 显示有关资源的详细信息
# kubectl describe 资源类型 资源名称#查看名称为nginx-XXXXXX的Pod的信息kubectl describe pod nginx-XXXXXX#查看名称为nginx的Deployment的信息kubectl describe deployment my-nginx
kubectl logs - 查看 pod 中的容器的打印日志(和命令 docker logs 类似)
# kubectl logs Pod名称#查看名称为nginx-pod-XXXXXXX的Pod内的容器打印的日志#本案例中的 nginx-pod 没有输出日志,所以您看到的结果是空的kubectl logs -f nginx-pod-XXXXXXX
kubectl exec - 在 pod 中的容器环境内执行命令(和命令 docker exec 类似)
# kubectl exec Pod名称 操作命令# 在名称为nginx-pod-xxxxxx的Pod中运行bashkubectl exec -it nginx-pod-xxxxxx /bin/bash### 注意:新版1.21.0 提示这个命令会过期
也可以独立跑一个 Pod
## kubectl run --helpkubectl run nginx --image=nginx
总结:
kubectl create 资源 #创建任意资源kubectl create deploy #创建部署kubectl run #只创建一个Podkubectl get 资源名(node/pod/deploy) -n xxx(指定名称空间,默认是default) #获取资源kubectl describe 资源名(node/pod/deploy) xxx #描述某个资源的详细信息kubectl logs 资源名 ##查看日志kubectl exec -it pod名 -- 命令 #进pod并执行命令kubectl delete 资源名(node/pod/deploy) xxx #删除资源
Service 通过一组 Pod 路由通信。Service 是一种抽象,它允许 Pod 死亡并在 Kubernetes 中复制,而不会影响应用程序。在依赖的 Pod (如应用程序中的前端和后端组件)之间进行发现和路由是由 Kubernetes Service 处理的。
Service 匹配一组 Pod 是使用标签(Label)和选择器(Selector),它们是允许对 Kubernetes 中的对象进行逻辑操作的一种分组原语。标签(Label)是附加在对象上的键/值对,可以以多种方式使用:
kubectl expose deployment tomcat6 --port=8912 --target-port=8080 --type=NodePort ## --port:集群内访问service的端口 8912 ## --target-port: pod容器的端口 8080 ## --nodePort: 每个机器开发的端口 30403 ## 进行验证 kubectl get svc curl ip:port kubectl expose #暴露,成一个负载均衡网络 ## kubectl exec 进去pod修改,并测试负载均衡
我们创建了一个 Deployment ,然后通过服务提供访问 Pod 的方式。我们发布的 Deployment 只创建了一个 Pod 来运行我们的应用程序。当流量增加时,我们需要对应用程序进行伸缩操作以满足系统性能需求。
## 扩容的Pod会自动加入到他之前存在的Service(负载均衡网络)kubectl scale --replicas=3 deployment tomcat6#持续观测效果watch kubectl get pods -o wide
滚动更新允许通过使用新的实例逐步更新 Pod 实例从而实现 Deployments 更新,停机时间为零。
与应用程序扩展类似,如果暴露了 Deployment,服务(Service)将在更新期间仅对可用的 pod 进行负载均衡。可用 Pod 是应用程序用户可用的实例。
滚动更新允许以下操作:
#应用升级: tomcat:alpine、tomcat:jre8-alpine# kubectl set image deployment/my-nginx2 nginx=nginx:1.9.1##联合jenkins 形成持续集成,灰度发布功能kubectl set image deployment.apps/tomcat6 tomcat=tomcat:jre8-alpine #可以携带--record参数,记录变更##回滚升级### 查看历史记录kubectl rollout history deployment.apps/tomcat6kubectl rollout history deploy tomcat6### 回滚到指定版本kubectl rollout undo deployment.apps/tomcat6 --to-revision=1kubectl rollout undo deploy tomcat6 --to-revision=1
apiVersion: apps/v1#与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本kind: Deployment#该配置的类型,我们使用的是 Deploymentmetadata: #译名为元数据,即 Deployment 的一些基本属性和信息 name: nginx-deployment#Deployment 的名称 labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解 app: nginx#为该Deployment设置key为app,value为nginx的标签spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用 replicas: 1#使用该Deployment创建一个应用程序实例 selector: #标签选择器,与上面的标签共同作用,目前不需要理解 matchLabels: #选择包含标签app:nginx的资源 app: nginx template: #这是选择或创建的Pod的模板 metadata:#Pod的元数据 labels:#Pod的标签,上面的selector即选择包含标签app:nginx的Pod app: nginx spec: #期望Pod实现的功能(即在pod中部署) containers:#生成container,与docker中的container是同一种 - name: nginx#container的名称 image: nginx:1.7.9#使用镜像nginx:1.7.9创建container,该container默认80端口可访问
kubectl apply -f xxx.yaml
apiVersion: v1kind: Servicemetadata: name: nginx-service#Service 的名称 labels: #Service 自己的标签 app: nginx#为该 Service 设置 key 为 app,value 为 nginx 的标签spec: #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问 selector: #标签选择器 app: nginx#选择包含标签 app:nginx 的 Pod ports: - name: nginx-port#端口的名字 protocol: TCP #协议类型 TCP/UDP port: 80 #集群内的其他容器组可通过 80 端口访问 Service nodePort: 32600 #通过任意节点的 32600 端口访问 Service targetPort: 80#将请求转发到匹配 Pod 的 80 端口 type: NodePort#Serive的类型,ClusterIP/NodePort/LoaderBalancer
修改 deployment.yaml 中的 replicas 属性即可
完成后运行
kubectl apply -f xxx.yaml
修改 deployment.yaml 中的 imageName 属性等
完成后运行
kubectl apply -f xxx.yaml
以上都可以直接 kubectl edit deploy/service 等,修改完成后自动生效
留言与评论(共有 0 条评论) “” |