云原生之k8s服务管理

打印 上一主题 下一主题

主题 872|帖子 872|积分 2616

服务管理

Service

服务原理


  • 容器化带来的题目


  • 自动调度:在Pod创建之前,用户无法预知Pod所在的节点,以及Pod的IP地址
  • 一个已经存在的Pod在运行过程中,假如出现故障,Pod也会在新的节点使用新的IP举行部署
  • 应用程序访问服务的时候,地址也不能经常变更
  • 多个雷同的Pod如何访问他们上面的服务

  • Service就是解决这些题目的办法
  • 服务的自动感知


  • 服务会创建一个clusterIP这个地址对应资源地址,不管Pod如何变化,服务总能找到对应的Pod,且clusterIP保持不变


  • 服务的负载均衡


  • 假如服务后端对应多个Pod,则会通过IPTables/LVS规则将访问的哀求终极映射到Pod内部,自动在多个容器间实现负载均衡

  • 服务的自动发现


  • 服务创建时会自动在内部DNS上注册域名
  • 域名:[服务名称].[名称空间].svc.cluster.local
  1. 创建服务
  2. [root@master ~] kubectl create service clusterip websvc --tcp=80:80 --dry-run=client -o yaml # 资源清单文件
  3. [root@master ~] vim websvc.yaml
  4. ---
  5. kind: Service
  6. apiVersion: v1
  7. metadata:
  8.   name: websvc
  9. spec:
  10.   type: ClusterIP
  11.   selector:
  12.     app: web
  13.   ports:
  14.   - protocol: TCP
  15.     port: 80
  16.     targetPort: 80
  17. [root@master ~] kubectl apply -f websvc.yaml
  18. service/websvc created
  19. [root@master ~] kubectl get service
  20. NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)
  21. kubernetes   ClusterIP   10.245.0.1      <none>        443/TCP
  22. websvc       ClusterIP   10.245.5.18     <none>        80/TCP
  23. 创建后端应用
  24. [root@master ~] vim web1.yaml
  25. ---
  26. kind: Pod
  27. apiVersion: v1
  28. metadata:
  29.   name: web1
  30.   labels:
  31.     app: web   # 服务靠标签寻找后端
  32. spec:
  33.   containers:
  34.   - name: apache
  35.     image: myos:httpd
  36. [root@master ~] kubectl apply -f web1.yaml
  37. pod/web1 created
  38. [root@master ~] curl http://10.245.5.18
  39. Welcome to The Apache.
复制代码
ClusterIP服务


  • ClusterIP范例


  • 默认的ServiceType,通过集群的内部IP暴露服务,选择该值时服务只可以或许在集群内部访问

  • 域名自动注册
  1. 解析域名
  2. [root@master ~] dnf install -y bind-utils# 安装工具软件包
  3. # 查看 DNS 服务地址
  4. [root@master ~] kubectl -n kube-system get service kube-dns
  5. NAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)
  6. kube-dns   ClusterIP   10.245.0.10   <none>        53/UDP,53/TCP,9153/TCP
  7. # 域名解析测试
  8. [root@master ~] host websvc.default.svc.cluster.local 10.245.0.10
  9. Using domain server:
  10. Name: 10.245.0.10
  11. Address: 10.245.0.10#53
  12. Aliases:
  13. websvc.default.svc.cluster.local has address 10.245.5.18
  14. 服务自动感知
  15. [root@master ~] kubectl delete pods --all
  16. pod "web1" deleted
  17. [root@master ~] kubectl create -f web1.yml
  18. pod/web11 created
  19. [root@master ~] curl 10.245.167.50  #删除Pod后访问CLUSTER-IP仍能收到响应
  20. Welcome to The Apache.
  21. 负载均衡
  22. [root@master ~] sed 's,web1,web2,' web1.yaml |kubectl apply -f -
  23. pod/web2 created
  24. [root@master ~] sed 's,web1,web3,' web1.yaml |kubectl apply -f -
  25. pod/web3 created
  26. [root@master ~] curl -s http://10.245.5.18/info.php |grep php_host
  27. php_host:       web1
  28. [root@master ~] curl -s http://10.245.5.18/info.php |grep php_host
  29. php_host:       web2
  30. [root@master ~] curl -s http://10.245.5.18/info.php |grep php_host
  31. php_host:       web3
  32. 固定 IP 服务
  33. [root@master ~] vim websvc.yaml
  34. ---
  35. kind: Service
  36. apiVersion: v1
  37. metadata:
  38.   name: websvc
  39. spec:
  40.   type: ClusterIP
  41.   clusterIP: 10.245.1.80    # 可以设置 ClusterIP
  42.   selector:
  43.     app: web
  44.   ports:
  45.   - protocol: TCP
  46.     port: 80
  47.     targetPort: 80
  48. [root@master ~] kubectl replace --force -f websvc.yaml
  49. service "websvc" deleted
  50. service/websvc replaced
  51. [root@master ~] kubectl get service
  52. NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)
  53. kubernetes   ClusterIP   10.245.0.1    <none>        443/TCP
  54. websvc       ClusterIP   10.245.1.80   <none>        80/TCP
  55. 端口别名
  56. [root@master ~] vim websvc.yaml
  57. ---
  58. kind: Service
  59. apiVersion: v1
  60. metadata:
  61.   name: websvc
  62. spec:
  63.   type: ClusterIP
  64.   clusterIP: 10.245.1.80
  65.   selector:
  66.     app: web
  67.   ports:
  68.   - protocol: TCP
  69.     port: 80
  70.     targetPort: myhttp    # 使用别名查找后端服务端口
  71. [root@master ~] kubectl replace --force -f websvc.yaml
  72. service "websvc" deleted
  73. service/websvc replaced
  74. [root@master ~] kubectl delete pod --all
  75. pod "web1" deleted
  76. pod "web2" deleted
  77. pod "web3" deleted
  78. [root@master ~] vim web1.yaml
  79. ---
  80. kind: Pod
  81. apiVersion: v1
  82. metadata:
  83.   name: web1
  84.   labels:
  85.     app: web
  86. spec:
  87.   containers:
  88.   - name: apache
  89.     image: myos:httpd
  90.     ports:               # 配置端口规范
  91.     - name: myhttp       # 端口别名
  92.       protocol: TCP      # 协议
  93.       containerPort: 80  # 端口号
  94. [root@master ~] kubectl apply -f web1.yaml
  95. pod/web1 created
  96. [root@master ~] curl http://10.245.1.80
  97. Welcome to The Apache.
复制代码

  • 服务的工作原理


  • kube-proxy是在全部节点上运行的署理。可以实现简单的数据转发,可以设置更新IPTables/LVS规则,在服务创建时,还提供服务地址DNS自动注册与服务发现功能

对外发布应用

服务范例


  • 发布服务


  • ClusterIP服务可以解决集群内应用互访的题目,但外部的应用无法访问集群内的资源,某些应用需要访问集群内的资源,我们就需要对外发布服务

  • 服务范例


  • ClusterIP:默认范例,可以实现Pod的自动感知与负载均衡,是最核心的服务范例,但ClusterIP不能对外发布服务,假如想对外发布服务可以使用NodePort或Ingress
NodePort服务


  • NodePort与Ingress


  • NodePort:使用根本端口映射(默认值:30000-3267)的方式对外发布服务,可以发布恣意服务(四层)
  • 使用Ingress控制器(一般由Nginx或HAProxy构成),用来发布http、https服务(七层)


  • 服务资源清单文件
  1. [root@master ~] vim nodeport.yml
  2. ---
  3. kind: Service
  4. apiVersion: v1
  5. metadata:
  6.   name: mysvc
  7. spec:
  8.   type: NodePort   #指定服务类型
  9.   selector:
  10.     app: web
  11.   ports:
  12.   - protocol: TCP
  13.     nodePort: 31234 #可选配置,不指定端口使用随机端口
  14.     port: 80
  15.     targetPort: 80
  16. [root@master ~] kubectl apply -f mysvc.yaml
  17. service/mysvc configured
  18. [root@master ~] kubectl get service
  19. NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)
  20. kubernetes   ClusterIP   10.245.0.1    <none>        443/TCP
  21. websvc       ClusterIP   10.245.1.80   <none>        80/TCP
  22. mysvc        NodePort    10.245.3.88   <none>        80:30080/TCP
  23. Nodeport会在所有节点映射端口,可以访问任意节点
  24. [root@master ~] curl http://node-0001:30080
  25. Welcome to The Apache.
  26. [root@master ~] curl http://node-0002:30080
  27. Welcome to The Apache.
  28. [root@master ~] curl http://node-0003:30080
  29. Welcome to The Apache.
  30. [root@master ~] curl http://node-0004:30080
  31. Welcome to The Apache.
  32. [root@master ~] curl http://node-0005:30080
  33. Welcome to The Apache.
复制代码
Ingress安装



  • Ingress是什么?


  • Ingress公开从集群外部到集群内服务的HTTP和HTTPS路由。流量路由由Ingress资源上定义的规则控制
  • Ingress控制器通常由负载均衡器来实现(Nginx、HAProxy)

  • 安装Ingress控制器


  • Ingress服务由(规则+控制器)构成
  • 规则负责订定计谋,控制器负责执行
  • 假如没有控制器,单独设置规则无效
  1. [root@master ~] cd plugins/ingress
  2. [root@master ingress] docker load -i ingress.tar.xz
  3. [root@master ingress] docker images|while read i t _;do
  4.     [[ "${t}" == "TAG" ]] && continue
  5.     [[ "${i}" =~ ^"harbor:443/".+ ]] && continue
  6.     docker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}
  7.     docker push harbor:443/plugins/${i##*/}:${t}
  8.     docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}
  9. done
  10. [root@master ingress] sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' deploy.yaml
  11. 443:    image: registry.k8s.io/ingress-nginx/controller:v1.9.6
  12. 546:    image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231226-1a7112e06
  13. 599:    image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231226-1a7112e06
  14. [root@master ingress] kubectl apply -f deploy.yaml
  15. [root@master ingress] kubectl -n ingress-nginx get pods
  16. NAME                                        READY   STATUS      RESTARTS
  17. ingress-nginx-admission-create--1-lm52c     0/1     Completed   0
  18. ingress-nginx-admission-patch--1-sj2lz      0/1     Completed   0
  19. ingress-nginx-controller-5664857866-tql24   1/1     Running     0
复制代码
设置Ingress规则

  1. 验证后端服务
  2. [root@master ~] kubectl get pods,services
  3. NAME       READY   STATUS    RESTARTS   AGE
  4. pod/web1   1/1     Running   0          35m
  5. NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)
  6. service/kubernetes   ClusterIP   10.245.0.1    <none>        443/TCP
  7. service/websvc       ClusterIP   10.245.1.80   <none>        80/TCP
  8. service/mysvc        NodePort    10.245.3.88   <none>        80:30080/TCP
  9. [root@master ~] curl http://10.245.1.80
  10. Welcome to The Apache.
  11. 对外发布服务
  12. # 查询 ingress 控制器类名称
  13. [root@master ~] kubectl get ingressclasses.networking.k8s.io
  14. NAME    CONTROLLER             PARAMETERS   AGE
  15. nginx   k8s.io/ingress-nginx   <none>       5m7s
  16. # 资源清单文件
  17. [root@master ~] kubectl create ingress mying --class=nginx --rule=nsd.tedu.cn/*=mysvc:80 --dry-run=client -o yaml
  18. [root@master ~] vim mying.yaml
  19. ---
  20. kind: Ingress
  21. apiVersion: networking.k8s.io/v1
  22. metadata:
  23.   name: mying
  24. spec:
  25.   ingressClassName: nginx
  26.   rules:
  27.   - host: nsd.tedu.cn
  28.     http:
  29.       paths:
  30.       - path: /
  31.         pathType: Prefix
  32.         backend:
  33.           service:
  34.             name: websvc
  35.             port:
  36.               number: 80
  37. [root@master ~] kubectl apply -f mying.yaml
  38. ingress.networking.k8s.io/mying created
  39. [root@master ~] kubectl get ingress
  40. NAME    CLASS   HOSTS         ADDRESS        PORTS
  41. mying   nginx   nsd.tedu.cn   192.168.1.51   80
  42. [root@master ~] curl -H "Host: nsd.tedu.cn" http://192.168.1.51
  43. Welcome to The Apache.
复制代码
Dashboard

概述


  • Dashboard 是什么?


  • Dashboard 是基于网页的 Kubernetes 用户界面。
  • Dashboard 同时展示了 Kubernetes 集群中的资源状态信息和全部报错信息。
  • 你可以使用 Dashboard 将应用部署到集群中,也可以对容器应用排错,还能管理集群资源。例如,你可以对应用弹性伸缩、发起滚动升级、重启等等。

  • 安装
  1. [root@master ~] cd plugins/dashboard
  2. [root@master dashboard] docker load -i dashboard.tar.xz
  3. [root@master dashboard] docker images|while read i t _;do
  4.     [[ "${t}" == "TAG" ]] && continue
  5.     [[ "${i}" =~ ^"harbor:443/".+ ]] && continue
  6.     docker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}
  7.     docker push harbor:443/plugins/${i##*/}:${t}
  8.     docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}
  9. done
  10. [root@master dashboard] sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' recommended.yaml
  11. 193:    image: kubernetesui/dashboard:v2.7.0
  12. 278:    image: kubernetesui/metrics-scraper:v1.0.8
  13. [root@master dashboard] kubectl apply -f recommended.yaml
  14. [root@master dashboard] kubectl -n kubernetes-dashboard get pods
  15. NAME                                         READY   STATUS    RESTARTS
  16. dashboard-metrics-scraper-66f6f56b59-b42ng   1/1     Running   0
  17. kubernetes-dashboard-65ff57f4cf-lwtsk        1/1     Running   0
复制代码

  • 发布服务
  1. # 查看服务状态
  2. [root@master dashboard] kubectl -n kubernetes-dashboard get service
  3. NAME                        TYPE        CLUSTER-IP       PORT(S)
  4. dashboard-metrics-scraper   ClusterIP   10.245.205.236   8000/TCP
  5. kubernetes-dashboard        ClusterIP   10.245.215.40    443/TCP
  6. # 获取服务资源对象文件
  7. [root@master dashboard] sed -n '30,45p' recommended.yaml >dashboard-svc.yaml
  8. [root@master dashboard] vim dashboard-svc.yaml
  9. ---
  10. kind: Service
  11. apiVersion: v1
  12. metadata:
  13.   labels:
  14.     k8s-app: kubernetes-dashboard
  15.   name: kubernetes-dashboard
  16.   namespace: kubernetes-dashboard
  17. spec:
  18.   type: NodePort
  19.   ports:
  20.     - port: 443
  21.       nodePort: 30443
  22.       targetPort: 8443
  23.   selector:
  24.     k8s-app: kubernetes-dashboard
  25. [root@master dashboard] kubectl apply -f dashboard-svc.yaml
  26. service/kubernetes-dashboard configured
  27. [root@master dashboard] kubectl -n kubernetes-dashboard get service
  28. NAME                        TYPE        CLUSTER-IP       PORT(S)
  29. dashboard-metrics-scraper   ClusterIP   10.245.205.236   8000/TCP
  30. kubernetes-dashboard        NodePort    10.245.215.40    443:30443/TCP
复制代码
认证和授权

ServiceAccount

用户概述

用户认证


  • 全部Kubernetes集群都有两类用户:由Kubernetes管理的服务帐号和普通用户
  • 普通用户是以证书或秘钥形式签发,重要用途是认证和鉴权,集群中并不包罗用来代表普通用户帐号的对象,普通用户的信息无法调用和查询
  • 服务账号是KubernetesAPI所管理的用户。它们被绑定到特定的名字空间,与一组Secret凭据相干联,供Pod调用以获得相应的授权。
创建ServiceAccount


  • 创建服务账号
  1. # 资源对象模板
  2. [root@master ~] kubectl -n kubernetes-dashboard create serviceaccount kube-admin --dry-run=client -o yaml
  3. [root@master ~] vim admin-user.yaml
  4. ---
  5. kind: ServiceAccount
  6. apiVersion: v1
  7. metadata:
  8.   name: kube-admin
  9.   namespace: kubernetes-dashboard
  10. [root@master ~] kubectl apply -f admin-user.yaml
  11. serviceaccount/kube-admin created
  12. [root@master ~] kubectl -n kubernetes-dashboard get serviceaccounts
  13. NAME                   SECRETS   AGE
  14. default                0         16m
  15. kube-admin             0         11s
  16. kubernetes-dashboard   0         16m
复制代码

  • 获取用户 token
  1. [root@master ~] kubectl -n kubernetes-dashboard create token kube-admin  # 生成Base64 编码的令牌数据
复制代码
权限管理

资源对象描述作用域ServiceAccount服务账号,为 Pod 中运行的历程提供了一个身份单一名称空间Role角色,包罗一组代表相干权限的规则单一名称空间ClusterRole角色,包罗一组代表相干权限的规则全集群RoleBinding将权限赋予用户,Role、ClusterRole 均可使用单一名称空间ClusterRoleBinding将权限赋予用户,只可以使用 ClusterRole全集群 资源对象权限
createdeletedeletecollectiongetlistpatchupdatewatch创建删除删除聚集获取属性获取列表补丁更新监控 角色与授权


  • 假如想访问和管理kubernetes集群,就要对身份以及权限做验证,kubernetes支持的鉴权模块有Node、RBAC、ABAC、Webhook API


  • Node:一种特殊用途的鉴权模式,专门对kubelet发出的哀求举行鉴权
  • RBAC:是一种基于构造中用户的角色来控制资源使用的方法
  • ABAC:基于属性的访问控制,是一种通过将用户属性与权限组合在一起向用户授权的方法
  • Webhook:是一个HTTP回调

  • RBAC授权(RBAC声明白四种Kubernetes对象)


  • Role:用来在某一个名称空间内创建授权角色,创建Role时,必须指定所属的名字空间的名字
  • ClusterRole:可以和Role雷同完成授权。但属于集群范围,对全部名称空间有用
  • RoleBinding:是将角色中定义的权限赋予一个大概一组用户,可以使用Role或ClusterRole完成授权
  • ClusterRoleBinding在集群范围执行授权,对全部名称空间有用,只能使用ClusterRole完成授权
  1. 普通角色
  2. [root@master ~] kubectl cluster-info dump |grep authorization-mode
  3.                             "--authorization-mode=Node,RBAC",
  4. # 资源对象模板
  5. [root@master ~] kubectl -n default create role myrole --resource=pods --verb=get,list --dry-run=client -o yaml
  6. [root@master ~] kubectl -n default create rolebinding kube-admin-role --role=myrole --serviceaccount=kubernetes-dashboard:kube-admin --dry-run=client -o yaml
  7. [root@master ~] vim myrole.yaml
  8. ---
  9. kind: Role
  10. apiVersion: rbac.authorization.k8s.io/v1
  11. metadata:
  12.   name: myrole
  13.   namespace: default
  14. rules:
  15. - apiGroups:
  16.   - ""
  17.   resources:
  18.   - pods
  19.   verbs:
  20.   - get
  21.   - list
  22. ---
  23. kind: RoleBinding
  24. apiVersion: rbac.authorization.k8s.io/v1
  25. metadata:
  26.   name: kube-admin-role
  27.   namespace: default
  28. roleRef:
  29.   apiGroup: rbac.authorization.k8s.io
  30.   kind: Role
  31.   name: myrole
  32. subjects:
  33. - kind: ServiceAccount
  34.   name: kube-admin
  35.   namespace: kubernetes-dashboard
  36. [root@master ~] kubectl apply -f myrole.yaml
  37. role.rbac.authorization.k8s.io/myrole created
  38. rolebinding.rbac.authorization.k8s.io/kube-admin-role created
  39. [root@master ~] kubectl delete -f myrole.yaml
  40. role.rbac.authorization.k8s.io "myrole" deleted
  41. rolebinding.rbac.authorization.k8s.io "kube-admin-role" deleted
  42. 集群管理员
  43. [root@master ~] kubectl get clusterrole
  44. NAME                              CREATED AT
  45. admin                             2022-06-24T08:11:17Z
  46. cluster-admin                     2022-06-24T08:11:17Z
  47. ... ...
  48. # 资源对象模板
  49. [root@master ~] kubectl create clusterrolebinding kube-admin-role --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kube-admin --dry-run=client -o yaml
  50. [root@master ~] vim admin-user.yaml
  51. ---
  52. kind: ServiceAccount
  53. apiVersion: v1
  54. metadata:
  55.   name: kube-admin
  56.   namespace: kubernetes-dashboard
  57. ---
  58. kind: ClusterRoleBinding
  59. apiVersion: rbac.authorization.k8s.io/v1
  60. metadata:
  61.   name: kube-admin-role
  62. roleRef:
  63.   apiGroup: rbac.authorization.k8s.io
  64.   kind: ClusterRole
  65.   name: cluster-admin
  66. subjects:
  67. - kind: ServiceAccount
  68.   name: kube-admin
  69.   namespace: kubernetes-dashboard
  70. [root@master ~] kubectl apply -f admin-user.yaml
  71. serviceaccount/kube-admin unchanged
  72. clusterrolebinding.rbac.authorization.k8s.io/kube-admin-role created
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表