赞
踩
本文记录了service管理,ingress管理,Dashboard管理插件,集群鉴权策略,角色与全局角色,赋权与全局角色赋权
容器化带来的问题:
自动调度:在Pod创建之前,用户无法预知Pod所在节点,以及Pod的IP地址
一个已经存在的Pod在运行过程中,如果出现故障,Pod也会在新的节点使用新的IP进行部署,而应用程序在访问服务的时候,地址不能经常变换
多个相同的Pod怎么访问他们上面的服务
使用Service就能解决这些问题
服务会创建一个clusterIP对应资源地址,不管Pod怎么变化,服务总能找到对应的Pod,且clusterIP保持不变
如果服务后端对应多个Pod,则会通过IPTables/LVS规则将访问的请求最终映射到Pod的容器内部,自动在多个容器间实现负载均衡
服务创建时会自动在内部DNS上注册域名
域名: <服务名称>.<名称空间>.svc.cluster.local
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
域名自动注册
服务的工作原理
kube-proxy是在所有节点上运行的代理,可以实现简单的数据转发,可以设置更新IPTables/LVS规则,在创建服务时,还提供服务地址DNS自动注册与服务发现功能
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 # 端口别名
ClusterIP服务可以解决集群内应用互访的问题,但外部的应用无法访问集群内的资源,某些应用需要访问集群内的资源,我们就需要对外发布服务
ClusterIP : 默认类型,可以实现Pod的自动感知与负载均衡,是最核心的服务类型,但ClusterIP不能对外发布服务,如果想对外发布服务可以使用NodePort或Ingress
NodePort与Ingress
NodePort:使用基于端口映射(默认:30000-32767) 的方式对外发布服务,可以发布任意服务(四层)
使用Ingress控制器(一般由Nginx或HAProxy构成),用来发布http、https服务(七层)
---
kind : Service
apiVersion : v1
metadata :
name : mysvc1
spec :
type : NodePort # 指定服务类型
selector :
app : web
ports :
- protocol : TCP
port : 80
nodePort : 30080 # 可选配置,不指定使用随即端口
targetPort : 80
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正常访问
--- 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
Dashboard是基于网页的Kubernetes用户界面
Dashboard展示了Kubernetes集群中的资源状态信息文件和所有报错信息
可以使用Dashboard 将应用部署到集群中,也可以对容器应用排错,还能管理集群资源。eg:对应用弹性伸缩,发起滚动升级,重启等
使用NodePort发布Dashboard
用户认证:
所有kubernetes集群都有两类用户,由k8s管理的服务帐号和普通用户
普通用户以证书或密钥形式签发,主要用途认证和鉴权,集群中并不包含用来代表普通用户帐号的对象,普通用户的信息无法调用和查询
服务帐号是k8sAPI所管理的用户,他们被绑定到特定的名称空间,与一组secret凭证相关联,供Pod调用以获得相应的权限
---
kind : ServiceAccount # 资源对象类型
apiVersion : v1 # 版本
metedata : # 元数据
name : kube-admin # ServiceAccount名称
namespcace : kubernetes-dashboard # 名称空间
创建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 # 权限
给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 # 帐号所在的名称空间
给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 # 帐号所在的名称空间
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。