云计算第四阶段: cloud二周目 07-08
cloud 07
一、k8s服务管理

创建服务
# 资源清单文件 [root@master ~]# kubectl create service clusterip websvc --tcp=80:80 --dry-run=client -o yaml [root@master ~]# vim websvc.yaml --- kind: Service apiVersion: v1 metadata:name: websvc spec:type: ClusterIPselector:app: webports:- protocol: TCPport: 80targetPort: 80[root@master ~]# kubectl apply -f websvc.yaml service/websvc created [root@master ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) kubernetes ClusterIP 10.245.0.1 <none> 443/TCP websvc ClusterIP 10.245.5.18 <none> 80/TCP解析域名
# 安装工具软件包 [root@master ~]# dnf install -y bind-utils # 查看 DNS 服务地址 [root@master ~]# kubectl -n kube-system get service kube-dns NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) kube-dns ClusterIP 10.245.0.10 <none> 53/UDP,53/TCP,9153/TCP # 域名解析测试 [root@master ~]# host websvc.default.svc.cluster.local 10.245.0.10 Using domain server: Name: 10.245.0.10 Address: 10.245.0.10#53 Aliases: websvc.default.svc.cluster.local has address 10.245.5.18
创建后端应用
[root@master ~]# vim web1.yaml --- kind: Pod apiVersion: v1 metadata:name: web1labels:app: web # 服务靠标签寻找后端 spec:containers:- name: apacheimage: myos:httpd[root@master ~]# kubectl apply -f web1.yaml pod/web1 created [root@master ~]# curl http://10.245.5.18 Welcome to The Apache.负载均衡
[root@master ~]# sed 's,web1,web2,' web1.yaml |kubectl apply -f - pod/web2 created [root@master ~]# sed 's,web1,web3,' web1.yaml |kubectl apply -f - pod/web3 created [root@master ~]# curl -s http://10.245.5.18/info.php |grep php_host php_host: web1 [root@master ~]# curl -s http://10.245.5.18/info.php |grep php_host php_host: web2 [root@master ~]# curl -s http://10.245.5.18/info.php |grep php_host php_host: web3
固定 IP 服务
[root@master ~]# vim websvc.yaml
---
kind: Service
apiVersion: v1
metadata:name: websvc
spec:type: ClusterIPclusterIP: 10.245.1.80 # 可以设置 ClusterIPselector:app: webports:- protocol: TCPport: 80targetPort: 80[root@master ~]# kubectl replace --force -f websvc.yaml
service "websvc" deleted
service/websvc replaced
[root@master ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP
websvc ClusterIP 10.245.1.80 <none> 80/TCP
端口别名
[root@master ~]# vim websvc.yaml --- kind: Service apiVersion: v1 metadata:name: websvc spec:type: ClusterIPclusterIP: 10.245.1.80selector:app: webports:- protocol: TCPport: 80targetPort: myhttp # 使用别名查找后端服务端口[root@master ~]# kubectl replace --force -f websvc.yaml service "websvc" deleted service/websvc replaced[root@master ~]# kubectl delete pod --all pod "web1" deleted pod "web2" deleted pod "web3" deleted[root@master ~]# vim web1.yaml --- kind: Pod apiVersion: v1 metadata:name: web1labels:app: web spec:containers:- name: apacheimage: myos:httpdports: # 配置端口规范- name: myhttp # 端口别名protocol: TCP # 协议containerPort: 80 # 端口号[root@master ~]# kubectl apply -f web1.yaml pod/web1 created [root@master ~]# curl http://10.245.1.80 Welcome to The Apache.服务排错
--- kind: Service apiVersion: v1 metadata:name: web123 spec:type: ClusterIPclusterIP: 192.168.1.88selector:app: apacheports:- protocol: TCPport: 80targetPort: webnodePort
对外发布服务
[root@master ~]# vim mysvc.yaml --- kind: Service apiVersion: v1 metadata:name: mysvc spec:type: NodePort # 服务类型selector:app: webports:- protocol: TCPport: 80nodePort: 30080 # 映射端口号targetPort: 80[root@master ~]# kubectl apply -f mysvc.yaml service/mysvc configured [root@master ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) kubernetes ClusterIP 10.245.0.1 <none> 443/TCP websvc ClusterIP 10.245.1.80 <none> 80/TCP mysvc NodePort 10.245.3.88 <none> 80:30080/TCP[root@master ~]# curl http://node-0001:30080 Welcome to The Apache. [root@master ~]# curl http://node-0002:30080 Welcome to The Apache. [root@master ~]# curl http://node-0003:30080 Welcome to The Apache. [root@master ~]# curl http://node-0004:30080 Welcome to The Apache. [root@master ~]# curl http://node-0005:30080 Welcome to The Apache.二、lngress 安装与策略配置
安装控制器
[root@master ~]# cd plugins/ingress [root@master ingress]# docker load -i ingress.tar.xz [root@master ingress]# docker images|while read i t _;do[[ "${t}" == "TAG" ]] && continue[[ "${i}" =~ ^"harbor:443/".+ ]] && continuedocker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}docker push harbor:443/plugins/${i##*/}:${t}docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t} done [root@master ingress]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' deploy.yaml 443: image: registry.k8s.io/ingress-nginx/controller:v1.9.6 546: image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231226-1a7112e06 599: image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231226-1a7112e06[root@master ingress]# kubectl apply -f deploy.yaml [root@master ingress]# kubectl -n ingress-nginx get pods NAME READY STATUS RESTARTS ingress-nginx-admission-create--1-lm52c 0/1 Completed 0 ingress-nginx-admission-patch--1-sj2lz 0/1 Completed 0 ingress-nginx-controller-5664857866-tql24 1/1 Running 0验证后端服务
[root@master ~]# kubectl get pods,services NAME READY STATUS RESTARTS AGE pod/web1 1/1 Running 0 35mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) service/kubernetes ClusterIP 10.245.0.1 <none> 443/TCP service/websvc ClusterIP 10.245.1.80 <none> 80/TCP service/mysvc NodePort 10.245.3.88 <none> 80:30080/TCP[root@master ~]# curl http://10.245.1.80 Welcome to The Apache.对外发布服务
# 查询 ingress 控制器类名称 [root@master ~]# kubectl get ingressclasses.networking.k8s.io NAME CONTROLLER PARAMETERS AGE nginx k8s.io/ingress-nginx <none> 5m7s# 资源清单文件 [root@master ~]# kubectl create ingress mying --class=nginx --rule=nsd.tedu.cn/*=mysvc:80 --dry-run=client -o yaml [root@master ~]# vim mying.yaml --- kind: Ingress apiVersion: networking.k8s.io/v1 metadata:name: mying spec:ingressClassName: nginxrules:- host: nsd.tedu.cnhttp:paths:- path: /pathType: Prefixbackend:service:name: websvcport:number: 80[root@master ~]# kubectl apply -f mying.yaml ingress.networking.k8s.io/mying created [root@master ~]# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS mying nginx nsd.tedu.cn 192.168.1.51 80 [root@master ~]# curl -H "Host: nsd.tedu.cn" http://192.168.1.51 Welcome to The Apache.
三、Dashboard 安装
#下面给大家介绍下新的k8s插件
web 管理插件

安装 Dashboard
[root@master ~]# cd plugins/dashboard [root@master dashboard]# docker load -i dashboard.tar.xz [root@master dashboard]# docker images|while read i t _;do[[ "${t}" == "TAG" ]] && continue[[ "${i}" =~ ^"harbor:443/".+ ]] && continuedocker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}docker push harbor:443/plugins/${i##*/}:${t}docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t} done [root@master dashboard]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' recommended.yaml 193: image: kubernetesui/dashboard:v2.7.0 278: image: kubernetesui/metrics-scraper:v1.0.8 [root@master dashboard]# kubectl apply -f recommended.yaml [root@master dashboard]# kubectl -n kubernetes-dashboard get pods NAME READY STATUS RESTARTS dashboard-metrics-scraper-66f6f56b59-b42ng 1/1 Running 0 kubernetes-dashboard-65ff57f4cf-lwtsk 1/1 Running 0发布服务
# 查看服务状态 [root@master dashboard]# kubectl -n kubernetes-dashboard get service NAME TYPE CLUSTER-IP PORT(S) dashboard-metrics-scraper ClusterIP 10.245.205.236 8000/TCP kubernetes-dashboard ClusterIP 10.245.215.40 443/TCP # 获取服务资源对象文件 [root@master dashboard]# sed -n '30,45p' recommended.yaml >dashboard-svc.yaml [root@master dashboard]# vim dashboard-svc.yaml --- kind: Service apiVersion: v1 metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard spec:type: NodePortports:- port: 443nodePort: 30443targetPort: 8443selector:k8s-app: kubernetes-dashboard[root@master dashboard]# kubectl apply -f dashboard-svc.yaml service/kubernetes-dashboard configured [root@master dashboard]# kubectl -n kubernetes-dashboard get service NAME TYPE CLUSTER-IP PORT(S) dashboard-metrics-scraper ClusterIP 10.245.205.236 8000/TCP kubernetes-dashboard NodePort 10.245.215.40 443:30443/TCP
- #记得访问下仪表盘dashboard登录页面
四、RBAC 权限管理
服务账号与权限
创建服务账号
# 资源对象模板 [root@master ~]# kubectl -n kubernetes-dashboard create serviceaccount kube-admin --dry-run=client -o yaml [root@master ~]# vim admin-user.yaml --- kind: ServiceAccount apiVersion: v1 metadata:name: kube-adminnamespace: kubernetes-dashboard[root@master ~]# kubectl apply -f admin-user.yaml serviceaccount/kube-admin created [root@master ~]# kubectl -n kubernetes-dashboard get serviceaccounts NAME SECRETS AGE default 0 16m kube-admin 0 11s kubernetes-dashboard 0 16m获取用户 token
[root@master ~]# kubectl -n kubernetes-dashboard create token kube-admin <Base64 编码的令牌数据>
角色与鉴权
#类似网游DNF里面的角色管理,GM管理员和玩家的关系。
资源对象 描述 作用域 ServiceAccount 服务账号,为 Pod 中运行的进程提供了一个身份 单一名称空间 Role 角色,包含一组代表相关权限的规则 单一名称空间 ClusterRole 角色,包含一组代表相关权限的规则 全集群 RoleBinding 将权限赋予用户,Role、ClusterRole 均可使用 单一名称空间 ClusterRoleBinding 将权限赋予用户,只可以使用 ClusterRole 全集群 资源对象权限
create delete deletecollection get list patch update watch 创建 删除 删除集合 获取属性 获取列表 补丁 更新 监控 普通角色
[root@master ~]# kubectl cluster-info dump |grep authorization-mode"--authorization-mode=Node,RBAC",# 资源对象模板 [root@master ~]# kubectl -n default create role myrole --resource=pods --verb=get,list --dry-run=client -o yaml [root@master ~]# kubectl -n default create rolebinding kube-admin-role --role=myrole --serviceaccount=kubernetes-dashboard:kube-admin --dry-run=client -o yaml [root@master ~]# vim myrole.yaml --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata:name: myrolenamespace: default rules: - apiGroups:- ""resources:- podsverbs:- get- list--- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata:name: kube-admin-rolenamespace: default roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: myrole subjects: - kind: ServiceAccountname: kube-adminnamespace: kubernetes-dashboard[root@master ~]# kubectl apply -f myrole.yaml role.rbac.authorization.k8s.io/myrole created rolebinding.rbac.authorization.k8s.io/kube-admin-role created[root@master ~]# kubectl delete -f myrole.yaml role.rbac.authorization.k8s.io "myrole" deleted rolebinding.rbac.authorization.k8s.io "kube-admin-role" deleted集群管理员
[root@master ~]# kubectl get clusterrole NAME CREATED AT admin 2022-06-24T08:11:17Z cluster-admin 2022-06-24T08:11:17Z ... ...# 资源对象模板 [root@master ~]# kubectl create clusterrolebinding kube-admin-role --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kube-admin --dry-run=client -o yaml [root@master ~]# vim admin-user.yaml --- kind: ServiceAccount apiVersion: v1 metadata:name: kube-adminnamespace: kubernetes-dashboard--- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata:name: kube-admin-role roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin subjects: - kind: ServiceAccountname: kube-adminnamespace: kubernetes-dashboard[root@master ~]# kubectl apply -f admin-user.yaml serviceaccount/kube-admin unchanged clusterrolebinding.rbac.authorization.k8s.io/kube-admin-role created
cloud 08

#上一小节讲过K8S的有控制组件和计算组件。现在我们一起来深入研究K8S的控制组件。
一、Deployment


资源清单文件
[root@master ~]# kubectl create deployment myweb --image=myos:httpd --dry-run=client -o yaml
[root@master ~]# vim mydeploy.yaml
---
kind: Deployment # 资源对象类型
apiVersion: apps/v1 # 版本
metadata: # 元数据name: mydeploy # 名称
spec: # 详细定义replicas: 3 # 副本数量selector: # 定义标签选择器matchLabels: # 支持 matchExpressions 表达式语法app: deploy-httpd # 通过标签来确定那个 Pod 由它来管理template: # 定义用来创建 Pod 的模板,以下为 Pod 定义metadata:labels:app: deploy-httpdspec:containers:- name: apacheimage: myos:httpd
配置案例
# 创建控制器
[root@master ~]# kubectl apply -f mydeploy.yaml
deployment.apps/mydeploy created[root@master ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
mydeploy 3/3 3 3 1s# 控制器自动创建 ReplicaSet
[root@master ~]# kubectl get replicasets
NAME DESIRED CURRENT READY AGE
mydeploy-76f96b85df 3 3 3 2s# 控制器自动创建 Pod
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mydeploy-76f96b85df-5gng9 1/1 Running 0 3s
mydeploy-76f96b85df-vsfrw 1/1 Running 0 3s
mydeploy-76f96b85df-z9x95 1/1 Running 0 3s# 集群自维护自治理
[root@master ~]# kubectl delete pod --all
pod "mydeploy-76f96b85df-5gng9" deleted
pod "mydeploy-76f96b85df-vsfrw" deleted
pod "mydeploy-76f96b85df-z9x95" deleted# 删除后自动重新创建
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mydeploy-76f96b85df-7dvwh 1/1 Running 0 7s
mydeploy-76f96b85df-kpbz4 1/1 Running 0 7s
mydeploy-76f96b85df-kr2zq 1/1 Running 0 7s
集群服务
# 创建集群服务 [root@master ~]# vim websvc.yaml --- kind: Service apiVersion: v1 metadata:name: websvc spec:type: ClusterIPclusterIP: 10.245.1.80selector:app: deploy-httpdports:- protocol: TCPport: 80targetPort: 80[root@master ~]# kubectl replace --force -f websvc.yaml service/websvc replaced [root@master ~]# curl -m 3 http://10.245.1.80 Welcome to The Apache.集群扩缩容
#抽象来说,扩容就是在基础存储设备上,添加新的设备,然后挂载到新的设备上。达到扩容结果, 类似吃鸡游戏里的扩容弹夹。
而缩容就是为了达到更佳的运行效率,减少存储设备上的存储空间,达到缩容目的。古代的增兵减灶
# 集群扩容 [root@master ~]# kubectl scale deployment mydeploy --replicas 10 deployment.apps/mydeploy scaled[root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE mydeploy-76f96b85df-kg27l 1/1 Running 0 6s mydeploy-76f96b85df-q5fzb 1/1 Running 0 6s mydeploy-76f96b85df-rxhp4 1/1 Running 0 6s mydeploy-76f96b85df-szf69 1/1 Running 0 6s mydeploy-76f96b85df-tp2xj 1/1 Running 0 6s ......# 集群缩容 [root@master ~]# kubectl scale deployment mydeploy --replicas=2 deployment.apps/mydeploy scaled[root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE mydeploy-76f96b85df-7dvwh 1/1 Running 0 51s mydeploy-76f96b85df-kr2zq 1/1 Running 0 51s历史版本信息
# 查看历史版本 [root@master ~]# kubectl rollout history deployment mydeploy deployment.apps/mydeploy REVISION CHANGE-CAUSE 1 <none># 添加注释信息 [root@master ~]# kubectl annotate deployments mydeploy kubernetes.io/change-cause="httpd.v1" deployment.apps/mydeploy annotated[root@master ~]# kubectl rollout history deployment mydeploy deployment.apps/mydeploy REVISION CHANGE-CAUSE 1 httpd.v1# 更新资源清单文件 [root@master ~]# vim mydeploy.yaml # 在创建容器的镜像下面添加imagePullPolicy: Always[root@master ~]# kubectl apply -f mydeploy.yaml deployment.apps/mydeploy patched# 更新版本信息 [root@master ~]# kubectl annotate deployments mydeploy kubernetes.io/change-cause="httpd.v2" deployment.apps/mydeploy annotated[root@master ~]# kubectl rollout history deployment mydeploy deployment.apps/mydeploy REVISION CHANGE-CAUSE 1 httpd.v1 2 httpd.v2滚动更新
# 修改镜像,滚动更新集群 [root@master ~]# kubectl set image deployment mydeploy apache=myos:nginx deployment.apps/mydeploy image updated# 给新版本添加注释信息 [root@master ~]# kubectl annotate deployments mydeploy kubernetes.io/change-cause="nginx.v1" deployment.apps/mydeploy annotated# 查看历史版本信息 [root@master ~]# kubectl rollout history deployment mydeploy deployment.apps/mydeploy REVISION CHANGE-CAUSE 1 httpd.v1 2 httpd.v2 3 nginx.v1# 访问验证服务 [root@master ~]# curl -m 3 http://10.245.1.80 Nginx is running !版本回滚
#类似游戏里面的怀旧服,而这里的版本回滚是用于恢复数据
# 历史版本与回滚 [root@master ~]# kubectl rollout undo deployment mydeploy --to-revision 1 deployment.apps/mydeploy rolled back[root@master ~]# kubectl rollout history deployment mydeploy deployment.apps/mydeploy REVISION CHANGE-CAUSE 2 httpd.v2 3 nginx.v1 4 httpd.v1[root@master ~]# curl -m 3 http://10.245.1.80 Welcome to The Apache.
清理资源对象
# 删除控制器时会自动回收自己创建的 Pod
[root@master ~]# kubectl delete deployments mydeploy
deployment.apps "mydeploy" deleted
二、DaemonSet

配置案例
[root@master ~]# cp -a mydeploy.yaml myds.yaml [root@master ~]# vim myds.yaml --- kind: DaemonSet # 资源对象类型 apiVersion: apps/v1 metadata:name: myds # 控制器名称 spec:# replicas: 2 # 删除副本参数selector:matchLabels:app: ds-httpd # 修改标签防止冲突template:metadata:labels:app: ds-httpd # 修改标签防止冲突spec:containers:- name: apacheimage: myos:httpdimagePullPolicy: Always[root@master ~]# kubectl apply -f myds.yaml daemonset.apps/myds created [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS IP NODE myds-msrcx 1/1 Running 0 10.244.1.11 node-0001 myds-lwq8l 1/1 Running 0 10.244.2.17 node-0002 myds-4wt72 1/1 Running 0 10.244.3.14 node-0003 myds-6k82t 1/1 Running 0 10.244.4.15 node-0004 myds-9c6wc 1/1 Running 0 10.244.5.19 node-0005
清理资源对象
# 删除控制器
[root@master ~]# kubectl delete daemonsets myds
daemonset.apps "myds" deleted
三、Job、CronJob

Job 控制器
# 资源文件模板
[root@master ~]# kubectl create job myjob --image=myos:8.5 --dry-run=client -o yaml -- sleep 3
[root@master ~]# vim myjob.yaml
---
kind: Job
apiVersion: batch/v1
metadata:name: myjob
spec:template: # 以下定义 Pod 模板metadata: {}spec:restartPolicy: OnFailurecontainers:- name: myjobimage: myos:8.5command: ["/bin/sh"]args:- -c- |sleep 3exit $((RANDOM%2))[root@master ~]# kubectl apply -f myjob.yaml
job.batch/myjob created# 失败了会重启
[root@master ~]# kubectl get pods -l job-name=myjob -w
NAME READY STATUS RESTARTS AGE
myjob--1-lrtbk 1/1 Running 0 2s
myjob--1-lrtbk 0/1 Error 0 4s
myjob--1-lrtbk 1/1 Running 1 (1s ago) 5s
myjob--1-lrtbk 0/1 Completed 1 9s[root@master ~]# kubectl get jobs.batch
NAME COMPLETIONS DURATION AGE
myjob 1/1 8s 12s# 删除Job控制器
[root@master ~]# kubectl delete -f myjob.yaml
job.batch "myjob" deleted
#pod控制器创建失败,任务会确保创建成功而重启,避免失败
Cronjob
#类似ansible中的crontab模块,可以定时执行某一任务
配置案例
# 资源对象模板 [root@master ~]# kubectl create cronjob mycj --image=myos:8.5 --schedule='* * * * *' --dry-run=client -o yaml -- sleep 3 [root@master ~]# vim mycj.yaml --- kind: CronJob apiVersion: batch/v1 metadata:name: mycj spec:schedule: "* * * * *"jobTemplate: # 以下定义 Job 模板metadata: {}spec:template:metadata: {}spec:restartPolicy: OnFailurecontainers:- name: myjobimage: myos:8.5command: ["/bin/sh"]args:- -c- |sleep 3exit $((RANDOM%2))[root@master ~]# kubectl apply -f mycj.yaml cronjob.batch/mycj created [root@master ~]# kubectl get cronjobs NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE mycj * * * * 1-5 False 0 <none> 4s# 按照时间周期,每分钟触发一个任务 [root@master ~]# kubectl get jobs -w NAME READY STATUS RESTARTS mycj-27808172--1-w6sbx 0/1 Pending 0 mycj-27808172--1-w6sbx 0/1 ContainerCreating 0 mycj-27808172--1-w6sbx 1/1 Running 0 mycj-27808172--1-w6sbx 0/1 Completed 1# 保留三次结果,多余的会被删除 [root@master ~]# kubectl get jobs NAME COMPLETIONS DURATION AGE mycj-27605367 1/1 31s 3m30s mycj-27605368 1/1 31s 2m30s mycj-27605369 1/1 31s 90s mycj-27605370 0/1 30s 30s[root@master ~]# kubectl get jobs NAME COMPLETIONS DURATION AGE mycj-27605368 1/1 31s 2m33s mycj-27605369 1/1 31s 93s mycj-27605370 1/1 31s 33s# 删除CJ控制器 [root@master ~]# kubectl delete -f mycj.yaml cronjob.batch "mycj" deleted
四、StatefulSet
Headless 服务
[root@master ~]# cp websvc.yaml stssvc.yaml [root@master ~]# vim stssvc.yaml --- kind: Service apiVersion: v1 metadata:name: stssvc # 服务名称 spec:type: ClusterIPclusterIP: None # 设置 IP 为 Noneselector:app: sts-httpd # 设置 Pod 标签ports:- protocol: TCPport: 80targetPort: 80[root@master ~]# kubectl apply -f stssvc.yaml service/stssvc created[root@master ~]# kubectl get services stssvc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE stssvc ClusterIP None <none> 80/TCP 51s资源清单文件
[root@master ~]# cp -a mydeploy.yaml mysts.yaml [root@master ~]# vim mysts.yaml --- kind: StatefulSet # 资源对象类型 apiVersion: apps/v1 metadata:name: mysts # 控制器名称 spec:serviceName: stssvc # 新增 headless 服务名称replicas: 3selector:matchLabels:app: sts-httpd # 修改标签防止冲突template:metadata:labels:app: sts-httpd # 修改标签防止冲突spec:containers:- name: apacheimage: myos:httpd配置案例
# statefulset 主要解决了 Pod 创建顺序的问题 # statefulset 主要解决了访问指定 Pod 的问题 [root@master ~]# kubectl apply -f mysts.yaml statefulset.apps/mysts created[root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE mysts-0 1/1 Running 0 3s mysts-1 1/1 Running 0 2s mysts-2 1/1 Running 0 1s# 所有 Pod IP 地址 [root@master ~]# host stssvc.default.svc.cluster.local 10.245.0.10 Using domain server: Name: 10.245.0.10 Address: 10.245.0.10#53 Aliases: stssvc.default.svc.cluster.local has address 10.244.1.81 stssvc.default.svc.cluster.local has address 10.244.2.82 stssvc.default.svc.cluster.local has address 10.244.3.83# 单个 Pod IP 地址 [root@master ~]# host mysts-0.stssvc.default.svc.cluster.local 10.245.0.10 Using domain server: Name: 10.245.0.10 Address: 10.245.0.10#53 Aliases: mysts-0.stssvc.default.svc.cluster.local has address 10.244.1.81# 删除sts控制器 [root@master ~]# kubectl delete -f mysts.yaml -f stssvc.yaml statefulset.apps "mysts" deleted service "stssvc" deleted 弹性云服务五、HorizontalPodAutoscaler
配置后端服务
# 为 Deploy 模板添加资源配额
[root@master ~]# cat mydeploy.yaml websvc.yaml >mycluster.yaml
[root@master ~]# vim mycluster.yaml
---
kind: Deployment
apiVersion: apps/v1
metadata:name: mydeploy
spec:replicas: 1selector:matchLabels:app: deploy-httpdtemplate:metadata:labels:app: deploy-httpdspec:containers:- name: apacheimage: myos:httpdresources: # 为该资源设置配额requests: # HPA 控制器会根据配额使用情况伸缩集群cpu: 300m # CPU 配额---
kind: Service
apiVersion: v1
metadata:name: websvc
spec:type: ClusterIPclusterIP: 10.245.1.80selector:app: deploy-httpdports:- protocol: TCPport: 80targetPort: 80[root@master ~]# kubectl replace --force -f mycluster.yaml
deployment.apps/mydeploy replaced
service/websvc replaced# 验证服务
[root@master ~]# kubectl top pods
NAME CPU(cores) MEMORY(bytes)
mydeploy-b4f9dc786-w4x2z 6m 18Mi [root@master ~]# curl -s http://10.245.1.80/info.php
<pre>
Array
([REMOTE_ADDR] => 10.244.219.64[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.61.1[REQUEST_URI] => /info.php
)
php_host: mydeploy-b4f9dc786-w4x2z
1229
HPA 控制器
[root@master ~]# vim myhpa.yaml --- kind: HorizontalPodAutoscaler apiVersion: autoscaling/v2 metadata:name: myhpa spec:behavior:scaleDown:stabilizationWindowSeconds: 60scaleTargetRef:kind: DeploymentapiVersion: apps/v1name: mydeployminReplicas: 1maxReplicas: 5metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 50[root@master ~]# kubectl apply -f myhpa.yaml horizontalpodautoscaler.autoscaling/myhpa created# 刚刚创建 unknown 是正常现象,最多等待 60s 就可以正常获取数据 [root@master ~]# kubectl get horizontalpodautoscalers NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS myhpa Deployment/mydeploy <unknown>/50% 1 5 0[root@master ~]# kubectl get horizontalpodautoscalers NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS myhpa Deployment/mydeploy 0%/50% 1 5 3配置案例
# 终端 1 访问提高负载 [root@master ~]# while sleep 1;do curl -s "http://10.245.1.80/info.php?id=100000" -o /dev/null; done & # 终端 2 监控 HPA 变化 [root@master ~]# kubectl get hpa -w NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE myhpa Deployment/mydeploy 0%/50% 1 5 1 1m myhpa Deployment/mydeploy 31%/50% 1 5 1 2m myhpa Deployment/mydeploy 70%/50% 1 5 1 2m15s myhpa Deployment/mydeploy 72%/50% 1 5 2 2m30s myhpa Deployment/mydeploy 36%/50% 1 5 2 2m45s myhpa Deployment/mydeploy 55%/50% 1 5 2 3m myhpa Deployment/mydeploy 58%/50% 1 5 3 3m15s myhpa Deployment/mydeploy 39%/50% 1 5 3 3m30s ... ... myhpa Deployment/mydeploy 66%/50% 1 5 4 5m myhpa Deployment/mydeploy 68%/50% 1 5 5 5m15s myhpa Deployment/mydeploy 55%/50% 1 5 5 5m30s myhpa Deployment/mydeploy 58%/50% 1 5 5 5m45s myhpa Deployment/mydeploy 62%/50% 1 5 5 6m# 如果 60s 内平均负载小于标准值,就会自动缩减集群规模 [root@master ~]# kubectl get hpa -w NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE myhpa Deployment/mydeploy 52%/50% 1 5 5 13m myhpa Deployment/mydeploy 44%/50% 1 5 5 13m15s myhpa Deployment/mydeploy 38%/50% 1 5 5 13m30s myhpa Deployment/mydeploy 35%/50% 1 5 5 13m45s myhpa Deployment/mydeploy 28%/50% 1 5 5 14m ... ... myhpa Deployment/mydeploy 8%/50% 1 5 5 18m30s myhpa Deployment/mydeploy 9%/50% 1 5 4 18m45s myhpa Deployment/mydeploy 9%/50% 1 5 4 19m myhpa Deployment/mydeploy 12%/50% 1 5 3 19m15s myhpa Deployment/mydeploy 15%/50% 1 5 3 19m30s myhpa Deployment/mydeploy 18%/50% 1 5 2 19m45s myhpa Deployment/mydeploy 33%/50% 1 5 1 20m
课后总结:
#我们本节学的好多控制器,都有差异和区别,可以按照类似以下的提示词,来对AI提问,得到更加符合工作使用环境的回答。

至此云计算cloud二周目内容更新完毕!
大家有想练习的,可以去华为云、阿里云等云平台,创建帐号,使用30天免费体验版云产品
熟悉相关云产品的使用与配置,里面也有一些项目的免费体验课,可以照着案例学基本项目架构
下一阶段,将回重回网络阶段,深入了解云计算与云原生领域的网络架构知识.
下个阶段见!!!
相关文章:
云计算第四阶段: cloud二周目 07-08
cloud 07 一、k8s服务管理 创建服务 # 资源清单文件 [rootmaster ~]# kubectl create service clusterip websvc --tcp80:80 --dry-runclient -o yaml [rootmaster ~]# vim websvc.yaml --- kind: Service apiVersion: v1 metadata:name: websvc spec:type: ClusterIPselector…...
智能合约开发工具Remix
不久前,我在B站、视频号和 YouTube 都陆续发布了新的一套免费视频课程《智能合约开发工具Remix》,总共分为了 9 个小节的视频,以下分别是这 9 个小节在 B 站的视频链接,喜欢直接看视频的伙伴可以去 B 站观看: 概况文件…...
YYF桌面 1.2 | 个性化桌面体验,清爽美观。
YYF桌面是一款经过定制的安卓桌面启动器,此版本基于1.2版本进行了一系列个性化修改。主界面快捷图标进行了美化处理,并采用了清爽半透明的图标背景。取消了底部快捷键,并重新制作了“全部应用”按钮,保留了动态效果。修改了右上角…...
【人工智能/计算机工程/大数据】第五届人工智能与计算工程国际学术会议(ICAICE 2024,2024年11月8-10日)
The 5th International Conference on Artificial Intelligence and Computer Engineering 第五届人工智能与计算工程国际学术会议(ICAICE 2024) 会议官网:www.event-icaice.org The 5th International Conference on Artificial Intellige…...
uni-app录音功能
纯纯干货,cv即用 <template><!-- 录音页面 --><view class"page"><view class"tape_box"><view class"upload_box1"><view class"upload_top"><view class"upload_img_title…...
C语言【调试】(个人笔记版)
调试 前言一、Bug二、调试工具1.DeBug2.Release 三、调试快捷键1、断点 四、调试时查看程序的当前信息1、查看临时变量2、查看内存3、查看调用堆栈、汇编、寄存器 总结 前言 这篇文章大都是我的个人笔记: 调试在日常程序设计中是很重要的。调试说白了就是为了解决代…...
连锁收银系统
商淘云连锁管理系统助力连锁企业实现“人货账”全方位数字化管理,它依托连锁品牌进销存管理实现门店订货、线下收银、线上商城、会员营销等一体化管理。 门店订货补货支持连锁直营、加盟 不同门店不同进货价、不同门店不同商品、不同门店在线或者账期支付、门店PC或…...
5.2024.10.21
2024.10.21 学习和复习 学习QT的流程控制、函数、内联函数复习C语言printf练习 问题及解决方案 C学到函数之后有些吃力代码逻辑能力不大行,需要巩固一下C语言基础再挤多点时间去学习嵌入式写代码前先把大概思路写出来 碎碎念 最近作业比较多,有点静不下…...
前端Socket互动小游戏开发体验分享
随着实时网络通信技术的不断发展,基于WebSocket的前端互动小游戏成为了一种非常流行的选择。WebSocket允许客户端和服务器之间进行双向通信,为游戏互动带来了更快的响应时间和更流畅的体验。本文将通过一个简单的互动小游戏来探讨前端如何利用WebSocket技…...
react项目,通过自定义 separator 属性来修改日期选择器中间的分隔符:
1. 引入必要的依赖 确保你已经引入了 DatePicker 组件和 moment 库。 import React, { Component } from react; import { DatePicker } from antd; import moment from moment; const { RangePicker } DatePicker; const dateFormat "YYYY/MM/DD"; 2. 定义父组…...
双十一有啥好用的家居好物推荐?2024性价比高的超声波清洗机推荐
双十一今天晚上就可以越热开抢了,还不知道购买什么物品的小伙伴们赶紧来看看我这篇文章,在众多家居好物中,超声波清洗机以其高效、便捷的特点,成为了许多家庭的必备神器。2024年,市场上涌现出了不少性价比超高的产品&a…...
比亚迪车机安装第三方应用教程
比亚迪车机安装第三方应用教程 比亚迪车机U盘安装APP, 无论是dlink3.0还是4.0都是安卓系统,因此理论上安卓应用是都可以安装的,主要就是横屏和竖屏的区别。在比亚迪上安装软件我主要推荐两种方法。 第一种,直接从电脑端下载安装布…...
移动零---双指针法
目录 一:题目 二:算法原理讲解 三:代码编写 一:题目 题目链接:https://leetcode.cn/problems/move-zeroes/description/ 二:算法原理讲解 三:代码编写 void moveZeroes2(vector<int>& nums) {for (int d…...
MoeCTF 2024 ---Misc方向WP
安全杂项 signin 题目描述: xdsec的小伙伴们和参赛者来上课,碰巧这一天签到系统坏了,作为老师的你,要帮他们 教师代签。 特殊提醒:luo同学今天好像在宿舍打游戏,不想来上课,这是严重的缺勤行为…...
【我的 RT 学习手札】信息收集
相关笔记整理自B站up主泷羽sec全栈渗透测试教学(免费) 视频链接为泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频 笔记只是方便师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线࿰…...
CMake变量:CMAKE_FIND_LIBRARY_SUFFIXES
CMAKE_FIND_LIBRARY_SUFFIXES是CMake中的一个变量,用于指定在查找库文件时使用的后缀列表。当CMake需要找到库文件时,它会尝试在这些后缀后添加库名来构建库文件的完整路径。例如,如果库名为mylib,并且CMAKE_FIND_LIBRARY_SUFFIXE…...
在使用 RabbitMQ 作为消息代理时,多个 Celery 实例(或应用)可以共享同一个 RabbitMQ 实例
在使用 RabbitMQ 作为消息代理时,多个 Celery 实例(或应用)可以共享同一个 RabbitMQ 实例。这样做可以简化基础设施管理,同时允许不同的 Celery 应用之间进行消息传递和协作。下面是如何配置多个 Celery 实例以使用同一个 RabbitM…...
ARM在嵌入式开发中的作用有哪些?
ARM在嵌入式开发中的作用主要体现在以下几个方面: 架构优势: ARM架构基于RISC(精简指令集计算机),具有精简而高效的指令集,适合资源受限的环境。低功耗设计使得ARM处理器在移动设备和嵌入式系统中非常受欢…...
-webkit-box-orient属性丢失?
在实际项目场景当中,我们经常会遇到需要对超长文本溢出省略的场景: 我们经常会这样写—— 单行省略: overflow: hidden; //文本溢出隐藏text-overflow: ellipsis; //文本溢出显示省略号white-space: nowrap; //不换行 多行省略:…...
openKylin系统SSH服务配置结合cpolar轻松实现开放麒麟远程连接
前言 本文主要介绍如何在openKlyin系统中设置ssh连接,并结合cpolar内网穿透工具实现远程也可以ssh连接本地局域网内部署的openKlyin系统. openKylin是中国首个基于Linux 的桌面操作系统开发者平台,通过开放操作系统源代码的方式,打造具有自…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...


















