本文主要是介绍k8s初级实战03--ns deployment service,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
k8s初级实战03--ns & deployment & svc
- 1 基础概念
- 2 常见用法
- 2.1 namespace
- 2.2 deployment
- 2.3 service
- 3 注意事项
- 4 说明
1 基础概念
-
namespace
Namespace(以下简称ns) 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pod, service, replication controller 和 deployment 等都是属于某一个 ns 的(默认是 default),而 node, persistent volume,ns 等资源则不属于任何 namespace。 -
deployment
Deployment 控制器为 Pods 和 ReplicaSets 提供声明式的更新能力。
Deployment 典型场景包括:1)创建副本集并运行pod;2)更新Pod的新状态从而实现pod迁移;3)回滚;4)扩容;5)暂停、恢复deployment状态;6)判断上线状态是否停滞;7) 清理不再需要的副本集。 -
service
服务将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
k8s Service 定义了这样一种抽象:逻辑上的一组 Pod,一种可以访问它们的策略 —— 通常称为微服务。 Service 所针对的 Pods 集合通常是通过选择算符来确定的。
k8s 中服务类型有4种,包括:ClusterIP,NodePort,LoadBalancer和ExternalName,- ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType。
- NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。
- LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。
- ExternalName:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创建任何类型代理。
2 常见用法
2.1 namespace
-
创建 ns
$ kubectl create namespace test-online namespace/test-online created 或者通过文件创建 vim ns-test-online.yaml apiVersion: v1 kind: Namespace metadata:name: test-online $ kubectl apply -f ns-test-online.yaml
-
查看 ns
$ kubectl get namespaces 或者 kubectl get ns NAME STATUS AGE default Active 6d10h kube-node-lease Active 6d10h kube-public Active 6d10h kube-system Active 6d10h ... test-online Active 22s
-
删除 ns
$ kubectl delete namespaces test-online 或者 $ kubectl delete -f ns-test-online.yaml
2.2 deployment
- 创建deployment
vim my-web01.yaml apiVersion: apps/v1 kind: Deployment metadata:name: my-web01 namespace: test-online spec:selector:matchLabels:app: my-web01template:metadata:labels:app: my-web01spec:containers:- image: nginx:1.19.6name: my-web01imagePullPolicy: IfNotPresent$ kubectl apply -f my-web01.yaml deployment.apps/my-web01 created
- 查看deployment
$ kubectl get deployment -n test-online 或者 kubectl get deploy -n test-online NAME READY UP-TO-DATE AVAILABLE AGE busybox 0/0 0 0 8d my-web01 1/1 1 1 30s
- 删除deployment
kubectl delete deployments my-web01 -n test-online 或者 kubectl delete -f my-web01.yaml
- 伸缩deployment
扩容到2 $ kubectl -n test-online scale deployment my-web01 --replicas 2 缩容为1 $ kubectl -n test-online scale deployment my-web01 --replicas 1自动伸缩,最少为1,最大为5副本,cpu使用率超过20%就会触发 $ kubectl -n test-online autoscale deployment my-web01 --max 5 --min 1 --cpu-percent 20 horizontalpodautoscaler.autoscaling/my-web01 autoscaled 删除自动伸缩 $ kubectl -n test-online delete horizontalpodautoscalers.autoscaling my-web01 horizontalpodautoscaler.autoscaling "my-web01" deleted
- 升级镜像
格式:kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N 升级镜像为latest kubectl -n test-online set image deployment/my-web01 my-web01=nginx:latest 或者 kubectl set image -f my-web01.yaml my-web01=nginx:1.19.4 deployment.apps/my-web01 image updated
- 回滚操作
1)查看deployment 历史操作,默认情况下没有设置--record,因此都为none $ kubectl rollout history -n test-online deployment my-web01 deployment.apps/my-web01 REVISION CHANGE-CAUSE 1 <none> 2 <none> 2)通过record 记录deployment的操作 $ kubectl set image -f my-web01.yaml my-web01=nginx:1.19.4 --record deployment.apps/my-web01 image updated $ kubectl set image -f my-web01.yaml my-web01=nginx:latest --record deployment.apps/my-web01 image updated 再次查看,发现已经记录了具体操作 $ kubectl rollout -n test-online history deployment my-web01 deployment.apps/my-web01 REVISION CHANGE-CAUSE 1 <none> 2 <none> 6 kubectl set image my-web01=nginx:1.19.4 --filename=my-web01.yaml --record=true 7 kubectl set image my-web01=nginx:latest --filename=my-web01.yaml --record=true 3)回滚到上一个操作,即image为1.19.4 $ kubectl rollout undo -n test-online deployment my-web01 deployment.apps/my-web01 rolled back 4)回退到指定版本 7,此时image再次为latest $ kubectl rollout undo -n test-online deployment my-web01 --to-revision 7 deployment.apps/my-web01 rolled back
2.3 service
由于正常情况下NodePort 类型的service比较容易实现,因此此处仅仅测试NodePort类型的service;NodePort类型的服务访问流程为:用户访问->节点IP:nodePort->服务cluster-ip:port->pod:targetPort。
- 创建服务
命令创建: $ kubectl -n test-online expose deployment my-web01 --port=80 --target-port=80 --type=NodePort service/my-web01 exposedyaml 创建: vim my-web01-svc.yaml apiVersion: v1 kind: Service metadata:name: my-web01 spec:ports:- port: 80 # service的端口protocol: TCPtargetPort: 80 # my-web01中容器的端口selector:app: my-web01type: NodePort $ kubectl apply -f my-web01-svc.yaml service/my-web01 created
- 查看服务
查看服务,PORT为 服务port:nodePort, 在集群内部可以通过 curl cluster-ip:port 访问对应的服务,在集群外部可以通过curl node-ip:nodePort 来访问对应的服务。 $ k8s % kubectl get svc -n test-online NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-web NodePort 10.1.175.63 <none> 5000:32020/TCP 12d my-web01 NodePort 10.1.122.47 <none> 80:32695/TCP 2m28s 查看服务的endpoints: $ kubectl get endpoints -n test-online NAME ENDPOINTS AGE my-web 10.244.2.40:5000 12d my-web01 10.244.1.250:80,10.244.2.156:80,10.244.2.157:80 3m24s
- 删除服务
通过命令行删除: $ kubectl delete service -n test-online my-web01 service "my-web01" deleted 通过文件删除: $ kubectl -n test-online delete -f my-web01-svc.yaml service "my-web01" deleted
3 注意事项
- ns 默认是没有资源限制的,但是可以结合 ResourceQuota 来限制 ns 的cpu、内存等资源。
4 说明
Kubernetes指南-Namespace
概念->工作负载->工作负载资源->Deployments
概念->服务、负载均衡和联网->服务
这篇关于k8s初级实战03--ns deployment service的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!