文章目录
一、k8s集群安全机制
1. 概述
(1)访问k8s集群的时候,需要经过三个步骤完成具体操作
第一步:认证
第二步:鉴权(授权)
第三步:准入控制
(2)进行访问的时候,过程中都需要经过apiserver,apiserver做统一协调,比如门卫。
访问过程中需要证书、token、或者用户名+密码
如果访问pod,需要serverAccount。
- 第一步 认证 传输安全 *传输安全:对外不暴露8080端口,只能内部访问,对外部使用端口6443 *认证
客户端身份认证常用方式:
- https证书认证,基于ca证书
- http token认证,通过token识别用户
- http基本认证,用户名+密码认证
第二步 鉴权(授权)
- 基于RBAC进行鉴权操作
- 基于角色访问控制
第三步 准入控制
- 就是准入控制器的列表,如果列表有请求内容,通过,没有则拒绝
2. RBAC——基于角色的访问控制
- 角色 role:特定命名空间访问权限 ClusterRole:所有命名空间访问权限
- 角色绑定 rolebinding:角色绑定到主体 ClusterRoleBinding:集群角色绑定到主体
- 主体 user:用户 group:用户组 serviceAccount:服务账号
例子:
二、Ingress
- 把端口号对外暴露,通过IP+端口号进行访问 使用Service里面的NodePort实现
- NodePort缺陷
- 在每个节点上都会启动一个端口,在访问的时候通过任何节点,通过节点IP+暴露端口号实现访问
- 意味着每个端口只能使用一次,一个端口对应一个应用
- 实际访问中都是用域名,根据不同域名跳转到不同端口服务中
- Ingerss和Pod关系
- pod和ingress通过service关联的
- ingress作为统一入口,由service关联一组pod
- ingress工作流程 ingress不是k8s内置的,需要部署。
- 使用ingress——以nginx为例 第一步 部署ingress Controller 第二步 创建ingress规则
- 使用ingress对外暴露应用 (1)创建nginx应用,对外暴露端口使用NodePort (2)部署ingress controller,详细yaml文件内容参考这篇文章 (3)创建ingress规则
(4)在Windows系统hosts文件中添加域名访问规则
没看懂没关系,详细操作以及yaml文件参考文章通过域名访问服务
三、Helm
1. 引入
K8S上的应用对象,都是由特定的资源描述组成,包括 deployment、service 等。都保存各自文件中或者集中写到一个配置文件。然后 kubectl apply –f 部署。如果应用只由一个或几个这样的服务组成,上面部署方式足够了。而对于一个复杂的应用,会有很多类似上面的资源描述文件,例如微服务架构应用,组成应用的服务可能多达十个,几十个。如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源文件,而这种组织和管理应用的方式就显得力不从心了。且由于缺少对发布过的应用版本管理和控制,使Kubernetes 上的应用维护和更新等面临诸多的挑战,主要面临以下问题:(1)如何将这些服务作为一个整体管理 (2)这些资源文件如何高效复用 (3)不支持应用级别的版本管理。
- 之前方式部署应用基本过程
- 编写yaml文件 1.1 deployment 1.2 service 1.3 ingress
缺陷:
- 如果使用之前方式部署单一应用,少数服务的应用,比较合适
- 比如部署微服务项目,可能有几十个服务,每个服务都有一套yaml文件,需要维护大量yaml文件,版本管理特别不方便
2. 使用功能Helm可以解决哪些问题
(1)使用helm可以把这些yaml作为一个整体管理
(2)实现yaml高效复用
(3)使用helm实现应用级别的版本管理
3. 介绍
Helm 是一个 Kubernetes 的包管理工具,就像 Linux 下的包管理器,如 yum / apt 等,可以很方便的将之前打包好的 yaml 文件部署到 kubernetes 上。
4. 3个重要概念
(1)helm:一个命令行客户端工具,主要用于 Kubernetes 应用 chart 的创建、打包、发布和管理。
(2)Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。(把yaml打包,是yaml的集合)
(3)Release:基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个release;将在 k8s 中创建出真实运行的资源对象。(基于chart 部署实体,应用级别的版本管理)
5. helm 版本变化
2019年11月13 日,Helm 团队发布 Helm v3 的第一个稳定版本。
本主要变化如下:
(1)V3版本删除Tiller
(2)Release 名称可以在不同命名空间重用
(3)支持将 Chart 推送至 Docker 镜像仓库中
6. helm安装及配置仓库
- helm安装 第一步:下载helm安装压缩文件,上传到Linux系统中 第二步:解压helm压缩文件,把解压后的linux-amd64/helm目录移动到/usr/bin/ 目录下
- 配置helm仓库
微软仓库(http://mirror.azure.cn/kubernetes/charts)这个仓库推荐,基本上官网有的 chart 这里都有。
阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )
官方仓库(https://hub.kubeapps.com/charts/incubator)官方 chart 仓库,国内有点不好使。
(1)添加仓库
helm repo add 仓库名称 仓库地址
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
(2)更新仓库地址
helm repo update
(3)删除仓库
helm repo remove aliyun
7. 使用helm快速部署应用
第一步:使用命令搜索应用
helm search repo 名称
(weave)
第二步:根据搜索内容选择安装helm install 安装之后的名称 搜索之后的应用名称
- 查看安装之后状态
helm list
或helm status +安装之后名称
从下图可以看到,目前ui-weave-scope并没有对外暴露端口,需要修改service类型为“NodePort”
** 修改service的yaml文件,type改为NodePort
kubectl get svc
kubectl edit svc + 名称
再次查看,既可以看到对外暴露的端口号。
8. 自己创建chart
- 使用命令创建Chart
helm create chart名称
- Chart.yaml:用于描述这个 Chart 的基本信息,包括名字、描述信息以及版本等。
- values.yaml :用于存储 templates 目录中模板文件中用到变量的值(全局变量)。
- Templates: 目录里面存放所有 yaml 模板文件。
- charts:目录里存放这个 chart
- 在 templates 文件夹创建2个yaml文件
- deployment.yaml
- service.yaml
kubectl create deployment web1 --image=nginx --dry-run -o yaml > deployment.yaml
kubectl expose deployment web1 --port=80 --target-port=80 --type=NodePort --dry-run -o yaml > service.yaml
- 安装mychart 安装前删除已存在的nginx:
kubectl delete deployment pod名称
kubectl install web1 mychart
kubectl get svc
- 应用升级
helm upgrade chart名称 目录
helm upgrade web1 mychart/
9. 实现yaml高效复用
通过传递参数,动态渲染模板,yaml内容动态传入参数生成。
在chart里有一个values.yaml文件,定义yaml文件全局变量。
yaml 文件大体有几个地方不同
- image
- tag
- label
- port
- replicas
- 在values.yaml定义变量和值
- 在templates的yaml文件使用values.yaml定义变量的值 通过表达式形式使用全局变量:
{{ .Values.变量名称}}
或{{ .Release.Name}}
四、持久化存储
数据卷 emptydir,是本地存储,pod重启,数据不存在了,需要对数据持久化存储。
1.nfs—网络存储
pod 重启,数据仍然存在
- 第一步:找一台服务器nfs服务端
(1)安装nfs
yum install -y nfs-utils
(2)设置挂载路径
vim /etc/exports
/data/nfs *(rw,no_root_squash)
检查:
执行如下命令,如果报错会有提示,修改/etc/exports文件即可。
exportfs -r # 不报错即可
(3)挂载路径需要创建出来,这里的挂在路径为:/data/nfs
- 第二步:在k8s集群node节点安装nfs,所有节点都要装
yum install -y nfs-utils
- 第三步:在nfs服务器启动nfs服务
systemctl start nfs``````ps -ef | grep nfs
- 第四步:在k8s集群部署应用使用nfs持久网络存储 ①在pv目录下创建
nfs-nginx.yaml
文件,将下述代码复制进去:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dep1
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
volumes:
- name: wwwroot
nfs:
server: 192.168.2.6 ## nfs服务器IP
path: /data/nfs ## nfs服务器挂在路径
②运行yaml文件
kubevtl apply -f nfs-nginx.yaml
③查看
kubectl get pods
④在nfs服务器中,目录/data/nfs/下创建
index.yaml
文件,编辑内容
⑤进入master中创建的pod中,查看index.yaml文件存在,查看内容
kubectl exec -it [pod 名称] bash
⑥暴露端口号
kubectl expose deployment nginx-dep1 --port=80 --target-port=80 --type=NodePort
⑦访问nginx显示编辑的内容
2. PV和PVC
- PV:持久化存储,对存储资源进行抽象,对外提供可以调用的地方(生产者)
- PVC:用于调用,不需要关心内部实现细节(消费者)
- 实现流程 pv相当于物理主机,pvc相当于电脑中的C盘D盘等存储磁盘,必须依赖于主机存在,类似于pvc必须要绑定pv
- 步骤 ①在pv目录下创建两个yaml文件,
pv.yaml
和pvc.yaml
,分别将下述内容复制到对应yaml文件中:pv.yaml内容:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/nfs ## nfs服务器中挂在路径
server: 192.168.2.6 ## nfs服务器IP
pvc.yaml内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dep1
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
volumes:
- name: wwwroot
persistentVolumeClaim:
claimName: my-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
②运行两个yaml文件
kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml
③查看
kubectl get pods
kubectl get pv,pvc
④进入任意一个创建的pod中,由于副本数为3,所以我们随便进一个,就会有和nfs服务器一样的index.html文件
kubectl exec -it nginx-dep1-58b7bf955f-7s8hp bash
版权归原作者 我是小bā吖 所有, 如有侵权,请联系我们删除。