当前位置:   article > 正文

kubernetes学习日志(七)

kubernetes学习日志(七)

前言

本文记录了service管理,ingress管理,Dashboard管理插件,集群鉴权策略,角色与全局角色,赋权与全局角色赋权

一、Service

服务原理

容器化带来的问题:
自动调度:在Pod创建之前,用户无法预知Pod所在节点,以及Pod的IP地址
一个已经存在的Pod在运行过程中,如果出现故障,Pod也会在新的节点使用新的IP进行部署,而应用程序在访问服务的时候,地址不能经常变换
多个相同的Pod怎么访问他们上面的服务
使用Service就能解决这些问题

服务的自动感知

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

服务的负载均衡

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

服务的自动发现

服务创建时会自动在内部DNS上注册域名
域名: <服务名称>.<名称空间>.svc.cluster.local

cluster IP 服务

clusterIP类型:
默认的ServiceType,通过集群内部IP暴露服务,选择该值时服务只能在集群内部访问

---
kind : Service   # 资源对象类型
apiVersion : v1  # 版本
metadata :   # 元数据
	name : mysvc   # 资源对象名称
spec :   # 详细信息
	type : ClusterIP  # 服务类型
	selector :   # 选择算符
		app : web   # Pod标签
	ports :   # 端口
	- protocol : TCP  # 协议
		port : 80   # 监听的端口
		targetPort : 80 # 后端服务端口
在Pod定义yaml文件定义标签,在clusterIPyaml文件中应用标签来绑定clusterIP
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

域名自动注册

服务的负载均衡

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

使用固定IP

ClusterIP是随机分配的,想使用固定IP,可以自定义,但IP的范围必须符合服务的CIDR

---
kind : Service
apiVersion : v1
metadata : 
	name : mysvc
spec : 
	type : ClusterIP
	clusterIP : 10.254.1.80 # 固定IP
	selector : 
		app:web
	ports : 
	- protocol : TCP
		port : 80
		targetPort : myhttp # 端口别名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

二、对外发布应用

发布应用

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

服务类型

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

NodePort服务

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

NodePort服务资源文件

---
kind : Service
apiVersion : v1
metadata : 
	name : mysvc1
spec : 
	type : NodePort # 指定服务类型
	selector : 
		app : web
	ports : 
	- protocol : TCP
		port : 80
		nodePort : 30080 # 可选配置,不指定使用随即端口
		targetPort : 80
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Ingress安装

Ingress公开从集群外部到集群内服务的HTTP和HTTPS路由。流量路由通常有负载均衡器来实现(Nginx、HAProxy)
安装Ingress控制器
Ingress服务由(规则+控制器)组成
规则负责制定策略,控制器负责执行
如果没有控制器,单独设置无效
获取控制器镜像及资源文件:
https://github.com/kubernetes/ingress-nginx
下载后上传到私有harbor仓库:
sed -ri ‘s,^(\simage: )(./)?(.+)@.*,\1harbor:443/plugins/\3,’ deploy.yaml
kubectl apply -f deploy.yaml
kubectl label nodes node-0001 ingress-ready=“true”
kubectl -n ingress-nginx get pods

第一步:调试好后端服务

必须保证ClusterIP正常访问

第二步 : 配置好Ingress规则

---
kind : Ingress  # 资源对象类型
apiVersion : networking.k8s.io/v1  # 资源对象版本
metedata :   # 元数据
	name : mying  # 资源对象名称
spec :   # 资源对象定义
	ingressClassName : nginx  # 使用的类名称
	rules :   # Ingress规则定义
	- host : nsd.tedu.cn  # 域名定义,没有可以不写
		http :   # 协议
			Paths :   # 访问的路径定义
			- backend :   # 后端服务
					service :   # 服务声明
						name : mysvc  # 服务名称
						port :   # 端口好声明
							number : 80  # 访问的服务端口号
				path : /   # 访问的url路径
				pathType : Prefix  # 路径类型 : Exact Prefix 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

三、Dashboard

Dashboard是基于网页的Kubernetes用户界面
Dashboard展示了Kubernetes集群中的资源状态信息文件和所有报错信息
可以使用Dashboard 将应用部署到集群中,也可以对容器应用排错,还能管理集群资源。eg:对应用弹性伸缩,发起滚动升级,重启等
使用NodePort发布Dashboard

四、认证和授权

ServiceAccount

用户认证:
所有kubernetes集群都有两类用户,由k8s管理的服务帐号和普通用户
普通用户以证书或密钥形式签发,主要用途认证和鉴权,集群中并不包含用来代表普通用户帐号的对象,普通用户的信息无法调用和查询
服务帐号是k8sAPI所管理的用户,他们被绑定到特定的名称空间,与一组secret凭证相关联,供Pod调用以获得相应的权限

创建ServiceAccount

---
kind : ServiceAccount  # 资源对象类型
apiVersion : v1  # 版本
metedata :   # 元数据
	name : kube-admin  # ServiceAccount名称
	namespcace : kubernetes-dashboard # 名称空间
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

创建Token
kubectl -n kubernetes-dashboard create token kube-admin

权限管理

角色与授权

想访问和管理Kubernetes 集群,就要对身份以及权限做认证,kubernetes支持的鉴权模块有Node、RBAC、ABAC、WebhookAPI
Node : 一种特殊用途的鉴权模式,专门对kubelet发出的请求进行鉴权
RBAC : 是一种基于组织中用户的角色来控制资源使用的方法
ABAC:基于属性的访问控制,是一种通过将用户属性与权限组合在一起向用户授权的方法
Webhook:是一个HTTP回调

RBAC授权 :
RBAC声明了四种Kubernetes对象:
Role:用来在某一个名称空间内创建授权角色,创建Role时,必须指明所属的名称空间的名字
ClusterRole : 可以和Role相同完成授权,但属于集群范围,对所有名称空间有效
RoleBinding:是将角色中定义的权限赋予一个或者一组用户,可以使用Role或ClusterRole完成授权。
ClusterRoleBinding : 在集群范围内执行授权,对所有名称空间有效,只能使用ClusterRole完成授权。

资源对象描述作用域
ServiceAccount服务帐号,为Pod中运行的进程提供了一个身份唯一名称空间
Role角色,包含一组代表相关权限的规则唯一名称空间
ClusterRole角色,包含一组代表关键权限的规则全集群
Rolebinding将权限赋予用户,Role、ClusterRole均可使用唯一名称空间
ClusterRoleBinding将权限赋予用户,只可以使用ClusterRole全集群

资源对象权限
创建 create
删除 delete
删除集合 deletecollection
获取属性 get
列表 list
补丁 patch
更新 update
监控 watch

--- 
kind : Role
apiVersion : rbac.authorization.k8s.io/v1
metadata : 
	namesapce : default
	name : myrole  	# 角色名称
rules :  			# 规则
- apiGroups : 	# 资源对象所属组信息
	- ""  				# 分组信息
	resources :  # 要设置权限的资源对象
	- pods 	# 授权资源对象名称
	verbs :	# 权限设置
	- get		# 权限
	- list  # 权限 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

给kube-admin授普通用户权限

---
kind : RoleBinding
apiVersion : rbac.authorzation.k8s.io/v1
metadata : 
	name : kube-admin-role		# 授权策略名称
	namespace : default		
roleRef : 		# 关联权限
	apiGroup : rbac.authorzation.k8s.io		# 角色对象组
	kind : role	# 角色对象
	name : myrole	# 角色名称
subjects : 	# 授权信息
- kind : ServiceAccount 	# 帐号资源对象
  name : kube-admin		# 帐号名称
  namespace : kubernetes-dashboard  # 帐号所在的名称空间
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

给kube-admin授管理员用户权限

---
kind : ClusterRoleBinding
apiVersion : rbac.authorzation.k8s.io/v1
metadata : 
	name : kube-admin-role		# 授权策略名称
	namespace : default		
roleRef : 		# 关联权限
	apiGroup : rbac.authorzation.k8s.io		# 角色对象组
	kind : ClusterRole	# 角色对象
	name : Cluster-admin	# 角色名称
subjects : 	# 授权信息
- kind : ServiceAccount 	# 帐号资源对象
  name : kube-admin		# 帐号名称
  namespace : kubernetes-dashboard  # 帐号所在的名称空间
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/852515
推荐阅读
相关标签
  

闽ICP备14008679号