0
点赞
收藏
分享

微信扫一扫

k8s初级实战03--ns & deployment & service


k8s初级实战03--ns & deployment & svc

  • ​​1 基础概念​​
  • ​​2 常见用法​​
  • ​​2.1 namespace​​
  • ​​2.2 deployment​​
  • ​​2.3 service​​
  • ​​3 注意事项​​
  • ​​4 说明​​

1 基础概念

  1. namespace
    Namespace(以下简称ns) 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pod, service, replication controller 和 deployment 等都是属于某一个 ns 的(默认是 default),而 node, persistent volume,ns 等资源则不属于任何 namespace。
  2. deployment
    Deployment 控制器为 Pods 和 ReplicaSets 提供声明式的更新能力。
    Deployment 典型场景包括:1)创建副本集并运行pod;2)更新Pod的新状态从而实现pod迁移;3)回滚;4)扩容;5)暂停、恢复deployment状态;6)判断上线状态是否停滞;7) 清理不再需要的副本集。
  3. service
    服务将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
    k8s Service 定义了这样一种抽象:逻辑上的一组 Pod,一种可以访问它们的策略 —— 通常称为微服务。 Service 所针对的 Pods 集合通常是通过选择算符来确定的。
    k8s 中服务类型有4种,包括:ClusterIP,NodePort,LoadBalancer和ExternalName,
  1. ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType。
  2. NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。
  3. LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。
  4. ExternalName:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创建任何类型代理。

2 常见用法

2.1 namespace

  1. 创建 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

  1. 查看 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

  1. 删除 ns

$ kubectl delete namespaces test-online 
或者
$ kubectl delete -f ns-test-online.yaml

2.2 deployment

  1. 创建deployment

vim  my-web01.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-web01
namespace: test-online
spec:
selector:
matchLabels:
app: my-web01
template:
metadata:
labels:
app: my-web01
spec:
containers:
- image: nginx:1.19.6
name: my-web01
imagePullPolicy: IfNotPresent

$ kubectl apply -f my-web01.yaml
deployment.apps/my-web01 created

  1. 查看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

  1. 删除deployment

kubectl delete deployments my-web01 -n test-online
或者
kubectl delete -f my-web01.yaml

  1. 伸缩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"

  1. 升级镜像

格式: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. 回滚操作

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。

  1. 创建服务

命令创建:
$ kubectl -n test-online expose deployment my-web01 --port=80 --target-port=80 --type=NodePort
service/my-web01 exposed

yaml 创建:
vim my-web01-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: my-web01
spec:
ports:
- port: 80 # service的端口
protocol: TCP
targetPort: 80 # my-web01中容器的端口
selector:
app: my-web01
type: NodePort
$ kubectl apply -f my-web01-svc.yaml
service/my-web01 created

  1. 查看服务

查看服务,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>

  1. 删除服务

通过命令行删除:
$ 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"

3 注意事项

  1. ns 默认是没有资源限制的,但是可以结合 ResourceQuota 来限制 ns 的cpu、内存等资源。

4 说明

​​Kubernetes指南-Namespace​​​​概念->工作负载->工作负载资源->Deployments​​​​概念->服务、负载均衡和联网->服务​​


举报

相关推荐

0 条评论