kubernetes

创建pod资源

yaml主要组成
apiVersion: v1 api版本
kind: pod 资源类型
metadata: 属性
spec: 详细

ReplicationController资源

rc滚动升级

升级

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 

service资源

修改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

deployment资源

有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:测试某个端口是否能够连接

liveness探针的exec使用

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 #失败一次就是不健康

liveness探针的httpGet使用

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

liveness探针的tcpSocket使用

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

readiness探针的httpGet使用

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

通过apiservicer反向代理访问service

http://10.0.0.11:8080/api/v1/proxy/namespaces/命名空间/services/service的名字/
设置api http的端口为8080

dashboard服务

http://ip:apiport/ui

弹性伸缩

安装heapster监控

heapster监控node状态,将数据存入influxdb数据库中,grefana渲染s数据显示在dashboard中

命令行创建弹性伸缩规则
kubectl autoscale deploy nginx-deployment --max=8 --min=1 --cpu-percent=10
#最大8个pod最小1个,cpu达到百分之十后进行扩容(hpa资源类型)

持久化

emptyDir

在宿主机上建立空目录给容器做持久化,缺点:删除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

HostPath

删除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

nfs

解决了不同宿主机共同使用数据的问题,缺点:无法实现高可用

      volumes:
      - name: mysql
        nfs:
          path: /data/wp_mysql #nfs服务器上开发的目录
          server: 10.0.0.11

查询配置文件字段
kubectl explain pod.spec
-required必须的字段
布尔值字段
有下一级缩进
<[]Object>列表形式,有多个值
字符串

persistent volume

由管理员创建,全局资源

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

访问模式可选值如下:

  • ReadWriteOnce:该卷能够以读写模式被加载到一个节点上。
  • ReadOnlyMany:该卷能够以只读模式加载到多个节点上。
  • ReadWriteMany:该卷能够以读写模式被多个节点同时加载。

回收策略可选值如下:

  • Retain-持久化卷被释放后,需要手工进行回收操作。
  • Recycle-基础擦除(“rm-rf /thevolume/*”)
  • Delete-相关的存储资产,例如AWSEBS或GCE PD卷一并删除。

目前,只有NFS和HostPath支持Recycle策略,AWSEBS、GCE PD支持Delete策略。

persistent volume claim

局部资源,创建后根据容量自动绑定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

glusterfs

安装

安装下载源
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

k8s对接分布式存储

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"

创建gluster pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: gluster
  labels:
    type: glusterfs
spec:
  capacity:
    storage: 50Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs"
    path: "qiangge"
    readOnly: false #只读

jenkins+gitee

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

你可能感兴趣的:(笔记)