yaml主要组成 | |
---|---|
apiVersion: v1 | api版本 |
kind: pod | 资源类型 |
metadata: | 属性 |
spec: | 详细 |
升级
kubectl rolling-update nginx -f nginx-rc1.15.yaml --update-period=10s
#rc名称 指定文件 启动10s后删除老pod,最多超不过6个pod
回滚
kubectl rolling-update nginx2 -f nginx-rc.yaml --update-period=1s
修改rc的数量
kubectl scale rc nginx --replicas=2
#交互式修改是实时的
修改nodeport的范围
vim /etc/kubernetes/apiserver
最后一行KUBE_API_ARGS="--service-node-port-range=3000-50000"
命令行创建svc资源
kubectl expose rc nginx --type=NodePort --port=80
#为nginx的rc暴露端口,nodeport指定不了,--cluster-ip=指定vip地址
service默认使用iptables(四层)来实现负载均衡, k8s 1.8新版本中使用lvs
有rc在滚动升级之后,会造成服务访问中断,于是k8s引入了deployment资源
启动deploy时会启动一个rs(rc的升级版),rs会启动pod,deploy的配置文件变更时会启动新的rs
创建
kubectl run nginx --image=10.0.0.11:5000/nginx:1.13 --replicas=3 --record
#后续显示版本信息
升级
kubectl set image deployment nginx nginx=10.0.0.11:5000/nginx:1.15
#交互式升级直接edit修改镜像版本
查看所有历史版本
kubectl rollout history deployment nginx
回滚到上一个版本
kubectl rollout undo deployment nginx
回滚到指定版本
kubectl rollout undo deployment nginx --to-revision=2
探针的种类
livenessProbe:健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器
readinessProbe:可用性检查,周期性检查服务是否可用,不可用将从service的endpoints中移除
探针的检测方法
exec:执行一段命令 返回值为0, 非0
httpGet:检测某个 http 请求的返回状态码 2xx,3xx正常, 4xx,5xx错误
tcpSocket:测试某个端口是否能够连接
apiVersion: v1
kind: Pod
metadata:
name: exec
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
args: #容易被覆盖,command不容易被覆盖
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 #第一次检查的时间,容器启动需要时间
periodSeconds: 5 #5s检查一次
timeoutSeconds: 5 #检查的超时时间
successThreshold: 1 #成功一次就是健康
failureThreshold: 1 #失败一次就是不健康
apiVersion: v1
kind: Pod
metadata:
name: httpget
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 3
periodSeconds: 3
apiVersion: v1
kind: Pod
metadata:
name: tcpSocket
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
args:
- /bin/sh
- -c
- tail -f /etc/hosts
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 10
periodSeconds: 3
apiVersion: v1
kind: ReplicationController
metadata:
name: readiness
spec:
replicas: 2
selector:
app: readiness
template:
metadata:
labels:
app: readiness
spec:
containers:
- name: readiness
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /qiangge.html
port: 80
initialDelaySeconds: 3
periodSeconds: 3
http://10.0.0.11:8080/api/v1/proxy/namespaces/命名空间/services/service的名字/
设置api http的端口为8080
http://ip:apiport/ui
heapster监控node状态,将数据存入influxdb数据库中,grefana渲染s数据显示在dashboard中
命令行创建弹性伸缩规则
kubectl autoscale deploy nginx-deployment --max=8 --min=1 --cpu-percent=10
#最大8个pod最小1个,cpu达到百分之十后进行扩容(hpa资源类型)
在宿主机上建立空目录给容器做持久化,缺点:删除pod后数据丢失
spec:
nodeName: 10.0.0.13
volumes:
- name: mysql #和volumeMounts名字一致
emptyDir: {} #常规写法
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
删除pod后数据不会丢失,缺点:分配到其他节点不能使用数据
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
解决了不同宿主机共同使用数据的问题,缺点:无法实现高可用
volumes:
- name: mysql
nfs:
path: /data/wp_mysql #nfs服务器上开发的目录
server: 10.0.0.11
查询配置文件字段
kubectl explain pod.spec
-required必须的字段
<[]Object>列表形式,有多个值
由管理员创建,全局资源
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
labels:
type: nfs001 #pvc有多个合适的pv绑定时,可以根据标签进行选择
spec:
capacity: #容量
storage: 10Gi
volumeMode: Filesystem #存储卷模式,默认,1.9版本支持块设备(raw block devices)
accessModes: #访问模式
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle #回收机制
nfs:
path: "/data/pv1"
server: 10.0.0.11
访问模式可选值如下:
回收策略可选值如下:
目前,只有NFS和HostPath支持Recycle策略,AWSEBS、GCE PD支持Delete策略。
局部资源,创建后根据容量自动绑定pv,可供同一namespace下的pod使用
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi #只会选择大于容量的pv绑定
使用pvc
volumeMounts:
- name: nfs
mountPath: /var/lib/mysql
volumes:
- name: nfs
persistentVolumeClaim:
claimName: pvc1 #pvc的name
安装下载源
yum install centos-release-gluster6.noarch -y
安装gluster
yum install glusterfs-server -y
一台机器上一个存储单元,一个存储单元就是一块硬盘
增加gluster节点
gluster peer probe k8s-node2
查看gluster节点
gluster pool list
#创建分布式复制卷
gluster volume create qiangge replica 2 k8s-master:/gfs/test1 k8s-node-1:/gfs/test1 k8s-master:/gfs/test2 k8s-node-1:/gfs/test2 force
#qiangge卷名字 replica副本数 force建议用硬盘名字
#启动卷
gluster volume start qiangge
#查看卷
gluster volume info qiangge
#挂载卷
mount -t glusterfs 10.0.0.11:qiangge /mnt
热扩容
gluster volume add-brick qiangge k8s-node-2:/gfs/test1 k8s-node-2:/gfs/test2 force
不重启识别硬盘
echo ‘- - -’ >/sys/class/scsi_host/host0/scan
echo ‘- - -’ >/sys/class/scsi_host/host1/scan
echo ‘- - -’ >/sys/class/scsi_host/host2/scan
blkid
查看硬盘的uuid,fstab写uuid
gluster是外部资源,因此需要创建endpoints资源
apiVersion: v1
kind: Endpoints #ep
metadata:
name: glusterfs #和service一致
namespace: tomcat
subsets:
- addresses:
- ip: 10.0.0.11
- ip: 10.0.0.12
- ip: 10.0.0.13
ports:
- port: 49152
protocol: TCP
apiVersion: v1
kind: Service
metadata:
name: glusterfs
namespace: tomcat
spec:
ports:
- port: 49152
protocol: TCP
targetPort: 49152
type: ClusterIP
volumes:
- name: gluster
glusterfs:
path: xiaobing #卷名字
endpoints: "glusterfs"
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster
labels:
type: glusterfs
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: "glusterfs"
path: "qiangge"
readOnly: false #只读
vim dockerfile
FROM 10.0.0.11:5000/nginx:1.13
ADD . /usr/share/nginx/html
源码管理添加git地址和认证方式
添加文本变量
执行shell
docker build -t 10.0.0.11:5000/yiliao:$version .
docker push 10.0.0.11:5000/yiliao:$version
kubectl -s 10.0.0.11:8080 set image -n yiliao deploy yiliao yiliao=10.0.0.11:5000/yiliao:$version
-s 指定api地址
回滚(另一个任务)
kubectl -s 10.0.0.11:8080 rollout undo -n yiliao deployment yiliao