k8s 容器编排(下)
1.k8s附加组件
2.k8s弹性伸缩
3.k8s持久化存储
4.使用jenkins实现k8s持续更新
5.k8s 高可用
一、k8s 附加组件
1.dns服务
①k8s中的service分配的虚拟IP是固定的,而pod异常后新生成的pod ip会发生变化,可以通过service做代理关联到后端的pod。
.
②通过设置k8s中的dns服务可以直接解析service的名字,得到对应service的ip,可以实现服务在集群内部互相访问。
安装dns服务
1:下载dns_docker镜像包
wget http://192.168.37.200/191127/docker_k8s_dns.tar.gz
2:导入dns_docker镜像包
3:创建dns服务(固定到一个后端node节点)
通过编写deployment和service的yml文件创建
4:检查
kubectl get all --namespace=kube-system
5:修改所有node节点kubelet的配置文件,并重启kubelet服务
vim /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster_dns=10.254.230.254 --cluster_domain=cluster.local"
2.namespace命名空间
作用:进行资源的隔离,一个业务一个space,互不影响。
1.创建 namespace
kubectl create namespace wordpress
2.在yml文件中应用,放在元数据下
...
metadata:
namespace: wordpress
...
3.查看该空间的资源
kubectl get all -n wordpress
3.健康检查和可用性检查
(1).探针的种类
livenessPort:健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器
.
readlinessPort:可用性检查,周期性检查服务是否可用,不可用将从service的endpoints中移除
(2).探针的检测方法
exec:执行一段命令,返回值为0(正常)或非0(不正常)
.
httpGet:检查http请求的返回状态码
.
tcpSocket:测试某个端口是否能够连接
(3).liveness探针
探针写在containers模块下,参数不写就使用默认值
#1.exec
...
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 #第一次检查开始时间
periodSeconds: 5 #检查周期
timeoutSeconds: 3 #超时时间
successThreshold: 1 #检查通过1次,就是成功
failureThreshold: 1 #检查不通过1次就算失败
...
#2.httpGet
...
livenessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 3
periodSeconds: 3
...
#3.tcpSocket
...
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 10
periodSeconds: 3
...
(4).readliness探针
#httpGet
...
readinessProbe:
httpGet:
path: /qiangge.html
port: 80
initialDelaySeconds: 3
periodSeconds: 3
...
4.kubernets dashboard 服务
(1)上传并导入镜像,打标签
(2)master节点创建dashboard的deployment和service资源
(3)访问http://IP:8080/ui
5.通过apiservice反向代理service
第一种:NodePort类型
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30008
第二种:ClusterIP类型
type: ClusterIP
ports:
- port: 80
targetPort: 80
http://10.0.0.11:8080/api/v1/proxy/namespaces/命令空间/services/service的名字/
二、k8s 弹性伸缩
1.heapster 监控
1.上传并导入镜像,打标签
监控(heapster)
存储数据(influxdb)
出图(grafana)
2.master节点创建相应的deployment和service资源
3.打开 dashbord 进行验证

2.弹性伸缩
三、k8s 持久化存储
1.emptyDir 空目录方式
使用场景: 在同一 个Pod里,不同的容器,共享数据卷。
.
如果容器被删除,数据仍然存在,如果Pod被 删除,数据也会被删除。
...
spec:
nodeName: 10.0.0.13
volumes: #宿主机中的挂载点
- name: mysql
emptyDir: {} #挂载到一个空目录,可以用docker inspect 查看
containers:
- name: wp-mysql
image: 10.0.0.11:5000/mysql:5.7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
volumeMounts: #容器挂载的的目录,并未该目录命名
- mountPath: /var/lib/mysql
name: mysql
...
2.hostPath
类似于docker 中的数据卷
介绍
hostPath宿主机路径,宿主机的文件系统的某一目录和pod建立关联关系,在pod删除时,存储数据不会丢失。但宿主机挂了,hostPath也就没用了。
...
spec:
nodeName: 10.0.0.12
volumes:
- name: mysql
hostPath:
path: /data/wp_mysql
containers:
- name: wp-mysql
image: 10.0.0.11:5000/mysql:5.7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql
...
3.nfs
不同node节点间的数据共享、
volumes:
- name: mysql
nfs:
path: /data/wp_mysql
server: 10.0.0.11
4.pv & pvc
使用场景:http://img2020.cnblogs.com/blog/711773/202006/711773-20200606111557348-1778227999.png
1.介绍
①pv:persistent volume 全局资源,k8s集群
.
②pvc:persistent volume claim 局部资源属于某一个namespace
.
原理:
PVC:描述 Pod想要使用的持久化属性,比如存储大小、读写权限等
PV:描述一个具体的Volume属性,比如Volume的类型、挂载目录、远程存储服务器地址等
2.创建 pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1 # pv的名字
labels:
type: nfs001
spec:
capacity:
storage: 10Gi # pv 的空间大小
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle # pv 的回收规则
nfs:
path: "/data/pv1" #挂载宿主机的目录
server: 10.0.0.11
#创建pv所要挂载的目录
mkdir -p /data/pv{1..3}
3.创建 pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: tomcat-mysql
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi # pvc 的空间大小
4.创建pod,使用 PVC(可以通过kubectl explian查看帮助)
volumes:
- name: mysql
persistentVolumeClaim:
claimName: tomcat-mysql
5.分布式存储 glusterfs
1.什么是glusterfs
Glusterfs是一个开源分布式文件系统,具有强大的横向扩展能力,可支持数PB存储容量和数千客户端,通过网络互联成一个并行的网络文件系统。具有可扩展性、高性能、高可用性等特点。
2.glusterfs 的实现
1.所有节点 安装 glusterfs ,并启动
yum install centos-release-gluster6.noarch -y
yum install glusterfs-server -y
2.为gluster集群增加存储单元brick
echo '- - -' >/sys/class/scsi_host/host0/scan
echo '- - -' >/sys/class/scsi_host/host1/scan
echo '- - -' >/sys/class/scsi_host/host2/scan
mkfs.xfs /dev/sdb
mkfs.xfs /dev/sdc
mkfs.xfs /dev/sdd
mkdir -p /gfs/test1
mkdir -p /gfs/test2
mkdir -p /gfs/test3
mount /dev/sdb /gfs/test1
mount /dev/sdc /gfs/test2
mount /dev/sdd /gfs/test3
3.添加存储资源池
master节点:
gluster peer probe k8s-node1
gluster peer probe k8s-node2
gluster pool list
4.glusterfs 卷的管理
#创建分布式复制卷
gluster volume create che replica 2 k8s-master:/gfs/test1 k8s-node-1:/gfs/test1 k8s-master:/gfs/test2 k8s-node-1:/gfs/test2 force
#启动卷
gluster volume start che
#查看卷
gluster volume info che
#挂载卷
mount -t glusterfs 10.0.0.11:/gluster volume add-brick che k8s-node-2:/gfs/test1 k8s-node-2:/gfs/test2 forceche /mnt
#扩容
6.k8s 对接 glusterfs
endpoint 可以连接外部服务
apiVersion: v1
kind: Endpoints
metadata:
name: mysql
namespace: tomcat
subsets:
- addresses:
- ip: 10.0.0.13
ports:
- port: 3306
protocol: TCP
四、使用jenkins实现k8s持续更新
操作过程:
1.安装jenkins
2.访问jenkins
3.配置jenkins拉取gitlab代码数据
4.拉取代码测试
5.编写dockerfile并测试
6.上传dockerfile到代码私有仓库
7.点击jenkins立即构建,自动构建docker镜像并上传到本地镜像私有仓库
五、k8s 高可用

操作过程:
1.安装配置 etcd 高可用 集群
2.安装配置一台与 控制节点master 环境一样的主机
3.两台 master 节点安装配置 Keppalived
4.所有node节点配置指向 api-server的vip