k8s中,一.service发布服务,二.dashboard:基于网页的k8s管理插件,三.资源服务与帐号权限

复制代码
一.service资源
	对内发布服务
		Cluster IP
	对外发布服务
		NodePort
		Ingress
二.dashboard:基于网页的k8s管理插件
三.资源服务与帐号权限

一.service:用户无法预知pod的ip地址以及所在的节点,多个相同的pod如何访问他们上面的服务
	    功能:
		1.服务自动感知:pod迁移后访问service的ip,不受影响
		2.服务的自动发现:服务创建时自动在内部dns上注册域名
			服务名称.名称空间.svc.cluster.local
		3.服务负载均衡:访问多个相同标签的服务
	
	1.ClusterIP类型:集群内部发布服务(标签服务)
	  1.1  资源清单文件生成
		#命令生成资源清单文件
		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: ClusterIP  #服务类型
		  selector:
		    app: web       #标签
		  ports:           #端口
		  - protocol: TCP  #协议
		    port: 80 	      #服务的端口
		    targetPort: 80 #后端pod端口

	  1.2 解析域名
		# 安装工具软件包
		[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
		websvc.default.svc.cluster.local has address 10.245.5.18

	  1.3 通过标签完成请求转发,服务和service资源设置相同标签,创建后端应用
		[root@master ~]# vim web1.yaml 
		---
		kind: Pod
		apiVersion: v1
		metadata:
		  name: web1
		  labels:
		    app: web   # 服务靠标签寻找后端
		spec:
		  containers:
		  - name: apache
		    image: myos:httpd

	 1.4 给service服务设置固定的ip
		---
		kind: Service
		apiVersion: v1
		metadata:
		  name: websvc
		spec:
		  type: ClusterIP
		  clusterIP: 10.245.1.80  #固定的ip
		  selector:
		    app: web
		  ports:
		  - protocol: TCP
		    port: 80
		    targetPort: 80

	1.5 端口别名,解决后端pod中多个服务的端口不一致情况
	    service资源设置:
		---
		kind: Service
		apiVersion: v1
		metadata:
		  name: websvc
		spec:
		  type: ClusterIP
		  clusterIP: 10.245.1.80  # 固定的ip
		  selector:
		    app: web
		  ports:
		  - protocol: TCP
		    port: 80
		    targetPort: myhttp  # 端口别名
	    pod资源设置:
		---
		kind: Pod
		apiVersion: v1
		metadata:
		  name: web1
		  labels:
		    app: web   	# 服务靠标签寻找后端
		spec:
		  containers:
		  - name: apache
		    image: myos:httpd
		  ports:
		  - name: myhttp  # 使用别名
		    protocol: TCP
		    containerPort: 80

	2.NodePort:使用基于端口映射(30000-32767),外部服务请求节点,节点将请求转发给内部的clusterip
		nodeport--clusterip(service)--pod
	2.1 NodePort对外发布服务
		---
		kind: Service
		apiVersion: v1
		metadata:
		  name: mysvc
		spec:
		  type: NodePort            # 服务类型
		  selector:
		    app: web
		  ports:
		  - protocol: TCP
		    port: 80
		    nodePort: 30080         # 映射端口号,不设置使用随机的端口号
		    targetPort: 80	
		外部服务通过端口转发访问服务:curl http://node-0001:30080

	3.Ingress(规则+控制器):通过http和https访问集群内部服务,支持域名解析
		ingress--service(clusterip)--pod
		前提:必须先配置好clusterip
		
	3.1 安装并配置ingress的规则
		# 查询ingress控制器类名称
		[root@master ~]# kubectl get ingressclasses.networking.k8s.io 
		---
		apiVersion: networking.k8s.io/v1
		kind: Ingress
		metadata:
		  name: simple
		spec:
		  ingressClassName: ningx #控制器
		  rules: 	       # 规则
		  - host: foo.com   # 域名
		    http:	       # 协议
		      paths:	
			//前端参数
		      - path: /bar	# 访问的url路径
		        pathType: Exact #路径的类型(Prefix:宽松模式,访问路径以及子路径的内容,Exact:严格模式)
			//后端参数	
		        backend: 	# 后端
		          service: 
		            name: svc1	#服务名
		            port:		#端口号
		              number: 80
		status:
		  loadBalancer: {}

二.dashbord插件:基于网页的k8s用户界面
	1.安装dashborad
		[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/".+ ]] && continue
		    docker 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
		sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' recommended.yaml
		[root@master dashboard]# kubectl apply -f recommended.yaml
		[root@master dashboard]# kubectl -n kubernetes-dashboard get pods
		
	2.修改nodePort发布服务
		---
		kind: Service
		apiVersion: v1
		metadata:
		  labels:
		    k8s-app: kubernetes-dashboard
		  name: kubernetes-dashboard
		  namespace: kubernetes-dashboard
		spec:
		  type: NodePort
		  ports:
		    - port: 443
		      nodePort: 30443
		      targetPort: 8443
		  selector:
		    k8s-app: kubernetes-dashboard
三.资源与帐号权限
	1.角色与权限分类
		资源对象			描述					  作用域
		ServiceAccount	服务账号,为 Pod 中运行的进程提供了一个身份	单一名称空间

		Role			角色,包含一组代表相关权限的规则		单一名称空间
		RoleBinding		将权限赋予用户,Role、ClusterRole 均可使用	单一名称空间

		ClusterRole		角色,包含一组代表相关权限的规则		全集群
		ClusterRoleBinding	将权限赋予用户,只可以使用 ClusterRole	全集群

	2.资源对象的权限(对资源类型进行权限管理)
		create	 delete	deletecollection	get	list	 	
		创建	 删除		删除集合	     获取属性	获取列表(多个)  
		patch	 		update  	watch
		补丁(补充某一部分内容)	 更新	  	监控

	3.serviceaccount创建服务帐号
		# 资源对象模板
		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-admin
			  namespace: kubernetes-dashboard
		
		[root@master ~]# kubectl -n kubernetes-dashboard get serviceaccounts
	
	4.获取用户 token
		[root@master ~]# kubectl -n kubernetes-dashboard create token kube-admin

	6.自定义角色资源类型
		# 角色资源对象模板
	    kubectl -n default create role myrole --resource=pods --verb=get,list --dry-run=client -o yaml
		---
		kind: Role
		apiVersion: rbac.authorization.k8s.io/v1
		metadata:
		  name: myrole
		  namespace: default
		rules:
		- apiGroups:
		  - ""
		  resources: # 设置的资源
		  - pods
		  verbs:  #设置的授权
		  - get
		  - list

	7.给kube-admin普通用户授权(RoleBinding)
		---
		kind: RoleBinding
		apiVersion: rbac.authorization.k8s.io/v1
		metadata:
		  name: kube-admin-role   #授权策略名称
		  namespace: default
		roleRef: 			#关联权限
		  apiGroup: rbac.authorization.k8s.io #角色对象组
		  kind: Role 			#角色资源对象
		  name: myrole 		#角色资源名称
		subjects: 			#帐号授权配置
		- kind: ServiceAccount     #帐号资源对象
		  name: kube-admin 		#帐号资源名称
		  namespace: kubernetes-dashboard #帐号所在的名称空间

	9.给集群管理员授权(ClusterRoleBinding)
		---
		kind: ServiceAccount
		apiVersion: v1
		metadata:
		  name: kube-admin
		  namespace: kubernetes-dashboard
		
		---
		kind: ClusterRoleBinding
		apiVersion: rbac.authorization.k8s.io/v1
		metadata:
		  name: kube-admin-role
		roleRef:
		  apiGroup: rbac.authorization.k8s.io
		  kind: ClusterRole
		  name: cluster-admin
		subjects:
		- kind: ServiceAccount
		  name: kube-admin
		  namespace: kubernetes-dashboard

一.service资源

对内发布服务

Cluster IP

对外发布服务

NodePort

Ingress

二.dashboard:基于网页的k8s管理插件

三.资源服务与帐号权限

一.service:用户无法预知pod的ip地址以及所在的节点,多个相同的pod如何访问他们上面的服务

功能:

1.服务自动感知:pod迁移后访问service的ip,不受影响

2.服务的自动发现:服务创建时自动在内部dns上注册域名

服务名称.名称空间.svc.cluster.local

3.服务负载均衡:访问多个相同标签的服务

1.ClusterIP类型:集群内部发布服务(标签服务)

1.1 资源清单文件生成

#命令生成资源清单文件

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: ClusterIP #服务类型

selector:

app: web #标签

ports: #端口

  • protocol: TCP #协议

port: 80 #服务的端口

targetPort: 80 #后端pod端口

1.2 解析域名

安装工具软件包

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

websvc.default.svc.cluster.local has address 10.245.5.18

1.3 通过标签完成请求转发,服务和service资源设置相同标签,创建后端应用

root@master \~# vim web1.yaml


kind: Pod

apiVersion: v1

metadata:

name: web1

labels:

app: web # 服务靠标签寻找后端

spec:

containers:

  • name: apache

image: myos:httpd

1.4 给service服务设置固定的ip


kind: Service

apiVersion: v1

metadata:

name: websvc

spec:

type: ClusterIP

clusterIP: 10.245.1.80 #固定的ip

selector:

app: web

ports:

  • protocol: TCP

port: 80

targetPort: 80

1.5 端口别名,解决后端pod中多个服务的端口不一致情况

service资源设置:


kind: Service

apiVersion: v1

metadata:

name: websvc

spec:

type: ClusterIP

clusterIP: 10.245.1.80 # 固定的ip

selector:

app: web

ports:

  • protocol: TCP

port: 80

targetPort: myhttp # 端口别名

pod资源设置:


kind: Pod

apiVersion: v1

metadata:

name: web1

labels:

app: web # 服务靠标签寻找后端

spec:

containers:

  • name: apache

image: myos:httpd

ports:

  • name: myhttp # 使用别名

protocol: TCP

containerPort: 80

2.NodePort:使用基于端口映射(30000-32767),外部服务请求节点,节点将请求转发给内部的clusterip

nodeport--clusterip(service)--pod

2.1 NodePort对外发布服务


kind: Service

apiVersion: v1

metadata:

name: mysvc

spec:

type: NodePort # 服务类型

selector:

app: web

ports:

  • protocol: TCP

port: 80

nodePort: 30080 # 映射端口号,不设置使用随机的端口号

targetPort: 80

外部服务通过端口转发访问服务:curl http://node-0001:30080

3.Ingress(规则+控制器):通过http和https访问集群内部服务,支持域名解析

ingress--service(clusterip)--pod

前提:必须先配置好clusterip

3.1 安装并配置ingress的规则

查询ingress控制器类名称

root@master \~# kubectl get ingressclasses.networking.k8s.io


apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

name: simple

spec:

ingressClassName: ningx #控制器

rules: # 规则

http: # 协议

paths:

//前端参数

  • path: /bar # 访问的url路径

pathType: Exact #路径的类型(Prefix:宽松模式,访问路径以及子路径的内容,Exact:严格模式)

//后端参数

backend: # 后端

service:

name: svc1 #服务名

port: #端口号

number: 80

status:

loadBalancer: {}

二.dashbord插件:基于网页的k8s用户界面

1.安装dashborad

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/".+ ] && continue

docker 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

sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' recommended.yaml

root@master dashboard# kubectl apply -f recommended.yaml

root@master dashboard# kubectl -n kubernetes-dashboard get pods

2.修改nodePort发布服务


kind: Service

apiVersion: v1

metadata:

labels:

k8s-app: kubernetes-dashboard

name: kubernetes-dashboard

namespace: kubernetes-dashboard

spec:

type: NodePort

ports:

  • port: 443

nodePort: 30443

targetPort: 8443

selector:

k8s-app: kubernetes-dashboard

三.资源与帐号权限

1.角色与权限分类

资源对象 描述 作用域

ServiceAccount 服务账号,为 Pod 中运行的进程提供了一个身份 单一名称空间

Role 角色,包含一组代表相关权限的规则 单一名称空间

RoleBinding 将权限赋予用户,Role、ClusterRole 均可使用 单一名称空间

ClusterRole 角色,包含一组代表相关权限的规则 全集群

ClusterRoleBinding 将权限赋予用户,只可以使用 ClusterRole 全集群

2.资源对象的权限(对资源类型进行权限管理)

create delete deletecollection get list

创建 删除 删除集合 获取属性 获取列表(多个)

patch update watch

补丁(补充某一部分内容) 更新 监控

3.serviceaccount创建服务帐号

资源对象模板

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-admin

namespace: kubernetes-dashboard

root@master \~# kubectl -n kubernetes-dashboard get serviceaccounts

4.获取用户 token

root@master \~# kubectl -n kubernetes-dashboard create token kube-admin

6.自定义角色资源类型

角色资源对象模板

kubectl -n default create role myrole --resource=pods --verb=get,list --dry-run=client -o yaml


kind: Role

apiVersion: rbac.authorization.k8s.io/v1

metadata:

name: myrole

namespace: default

rules:

  • apiGroups:

  • ""

resources: # 设置的资源

  • pods

verbs: #设置的授权

  • get

  • list

7.给kube-admin普通用户授权(RoleBinding)


kind: RoleBinding

apiVersion: rbac.authorization.k8s.io/v1

metadata:

name: kube-admin-role #授权策略名称

namespace: default

roleRef: #关联权限

apiGroup: rbac.authorization.k8s.io #角色对象组

kind: Role #角色资源对象

name: myrole #角色资源名称

subjects: #帐号授权配置

  • kind: ServiceAccount #帐号资源对象

name: kube-admin #帐号资源名称

namespace: kubernetes-dashboard #帐号所在的名称空间

9.给集群管理员授权(ClusterRoleBinding)


kind: ServiceAccount

apiVersion: v1

metadata:

name: kube-admin

namespace: kubernetes-dashboard


kind: ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1

metadata:

name: kube-admin-role

roleRef:

apiGroup: rbac.authorization.k8s.io

kind: ClusterRole

name: cluster-admin

subjects:

  • kind: ServiceAccount

name: kube-admin

namespace: kubernetes-dashboard

相关推荐
AR-26710-7 分钟前
Linux Day8——FHS文件系统层次
linux
小葱运维10 分钟前
日志规范(K8s 结构化日志)
运维·开源·云计算
周先生FullStack19 分钟前
Mac + 容器本地 MySQL/Redis 环境搭建与网络原理实战
java·spring boot·微服务·容器·架构·个人开发
其实防守也摸鱼20 分钟前
DeepSeek Harness 开源贡献手记:从入门到合入主线
服务器·数据库·windows·https·ssl
是店小二呀22 分钟前
MySQL 监控总在重复配置?用 Shell 自动部署 mysqld_exporter,再让 Prometheus 远程抓取
docker
qq_2976708726 分钟前
Ubuntu 打开系统应用老弹密码?三步彻底关闭免密
linux
杨云龙UP29 分钟前
DB2 HADR 主备切换实战:SQL1639N 认证问题、备库只读与双向 Takeover
linux·运维·数据库·db2·主备切换·角色互换
Wang's Blog1 小时前
Java 接入Redis: 密码认证与远程连接配置
java·服务器·redis
半仙白桑1 小时前
内核篇第一讲:linux创建进程
linux·fork·创建进程