k8s容器编排 (旧版)

k8s容器编排

文章目录

1:k8s集群的安装

1.1 k8s的架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Noj39dG-1594286656422)(F:\Linux\老男孩文档\image\image-20200707101336036.png)]

组件 名称说明
api-server提供http rest接口关键服务进程,是k8s所有资源的增删改查等操作的唯一入口,也是ks8s集群控制的入口进程
etcdk8s 数据库 存储服务
Controller-Manager是所有资源对象的自动化控制中心
kube-scheduler负责pod资源的调度工作
Node 组件名称说明
kubelt负责pod对应容器的创建,停止工作,与master密切协助,实现k8s集群管理的基本功能
docker 引擎负责本机容器的创建,管理功能。

除了核心组件,还有一些推荐的Add-ons:

组件名称说明
kube-dns负责为整个集群提供DNS服务
Ingress Controller为服务提供外网入口
Heapster提供资源监控
Dashboard提供GUI
Federation提供跨可用区的集群
Fluentd-elasticsearch提供集群日志采集、存储与查询

1.2:修改IP地址、主机和host解析

10.0.0.11 k8s-master
10.0.0.12 k8s-node-1
10.0.0.13 k8s-node-2

所有节点需要做hosts解析

base源

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

1.3:master节点安装etcd

yum install etcd -y

vim /etc/etcd/etcd.conf
6行:ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
21行:ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379"

systemctl start etcd.service
systemctl enable etcd.service

#测试
etcdctl set testdir/testkey0 0
etcdctl get testdir/testkey0

etcdctl -C http://10.0.0.11:2379 cluster-health

##etcd原生支持做集群,

##作业1:安装部署etcd集群,要求三个节点

1.4:master节点安装kubernetes

yum install kubernetes-master.x86_64 -y

vim /etc/kubernetes/apiserver 
8行:  KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
11行:KUBE_API_PORT="--port=8080"
14行:KUBELET_PORT="--kubelet-port=10250"
17行:KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379"
23行:KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

vim /etc/kubernetes/config
22行:KUBE_MASTER="--master=http://10.0.0.11:8080"

systemctl enable kube-apiserver.service
systemctl restart kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl restart kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl restart kube-scheduler.service

#检查服务是否安装正常

[root@k8s-master ~]# kubectl get componentstatus 
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"} 

1.5:node节点安装kubernetes

yum install kubernetes-node.x86_64 -y

vim /etc/kubernetes/config 
22行:KUBE_MASTER="--master=http://10.0.0.11:8080"

vim /etc/kubernetes/kubelet
5行:KUBELET_ADDRESS="--address=0.0.0.0"
8行:KUBELET_PORT="--port=10250"
11行:KUBELET_HOSTNAME="--hostname-override=10.0.0.12"
14行:KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080"

systemctl enable kubelet.service
systemctl start kubelet.service
systemctl enable kube-proxy.service
systemctl start kube-proxy.service

##在master节点检查

[root@k8s-master ~]# kubectl get nodes
NAME        STATUS    AGE
10.0.0.12   Ready     6m
10.0.0.13   Ready     3s

6:所有节点配置flannel网络

##所有节点
yum install flannel -y
sed -i 's#http://127.0.0.1:2379#http://10.0.0.11:2379#g' /etc/sysconfig/flanneld

##master节点:
etcdctl mk /atomic.io/network/config   '{ "Network": "172.16.0.0/16" }'
yum install docker -y

systemctl enable flanneld.service 
systemctl restart flanneld.service 
service docker restart
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service

##node节点:
systemctl enable flanneld.service 
systemctl restart flanneld.service 
service docker restart
systemctl restart kubelet.service
systemctl restart kube-proxy.service


测试flannel是否可以通信
##所有几点
docker run -it docker.io/busybox:latest
/ # ping 容器ip地址。 

解决flannel无法连通问题

###所有节点

iptables -P FORWARD ACCEPT  //临时生效
sed -i '16a ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT' /usr/lib/systemd/system/docker.service  && systemctl enable docker && systemctl restart docker //永久生效

7:配置master为镜像仓库

#所有节点
vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --registry-mirror=https://registry.docker-cn.com --insecure-registry=10.0.0.11:5000'

systemctl restart docker

#master节点
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry

2:什么是k8s,k8s有什么功能?

k8s是一个docker集群的管理工具

2.1 k8s的核心功能

自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。

弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量

服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。

滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。

2.2 k8s的历史

2014年 docker容器编排工具,立项

2015年7月 发布kubernetes 1.0, 加入cncf

2016年,kubernetes干掉两个对手,docker swarm,mesos 1.2版

2017年

2018年 k8s 从cncf基金会 毕业

2019年: 1.13, 1.14 ,1.15

cncf cloud native compute foundation

kubernetes (k8s): 希腊语 舵手,领航 容器编排领域,

谷歌16年容器使用经验,borg容器管理平台,使用golang重构borg,kubernetes

2.3 k8s的安装

yum安装 1.5 最容易安装成功,最适合学习的

源码编译安装—难度最大 可以安装最新版

二进制安装—步骤繁琐 可以安装最新版 shell,ansible,saltstack

kubeadm 安装最容易, 网络 可以安装最新版

minikube 适合开发人员体验k8s, 网络

2.4 k8s的应用场景

k8s最适合跑微服务项目!

3:k8s常用的资源

3.1 创建pod资源

k8s yaml的主要组成

apiVersion: v1  api版本
kind: pod   资源类型
metadata:   属性
spec:       详细

k8s_pod.yaml

mkdir pod && cd pod
vim k8s_pod.yaml
apiVersion: v1		#版本
kind: Pod           #资源类型
metadata:           #资源的元数据/属性
  name: nginx       #资源的名字,在同一个namespace中必须唯一
  labels: 
    app: web        #标签
spec:
  containers:		# 指定该资源的内容
    - name: nginx	#容器的名字
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80		#容器对外的端口
        
   
kubectl create -f k8s_pod.yaml
pod "nginx" created

#长时间处于创建状态
[root@k8s-master pod]# kubectl get pod
NAME      READY     STATUS              RESTARTS   AGE
nginx     0/1       ContainerCreating   0          1m

查看报错信息:
kubectl describe pod nginx

 "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"  提示:pod镜像无法pull下来

解决方法
上传pod到仓库中
##所有节点操作
vim /etc/kubernetes/kubelet 
#指定pod镜像路径。
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=172.16.20.100/library/pod-infrastructure:latest"

systemctl restart kubelet

pod资源:至少由两个容器组成,pod基础容器和业务容器组成

pod配置文件2:

apiVersion: v1
kind: Pod
metadata:
  name: test
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80
    - name: busybox
      image: 10.0.0.11:5000/busybox:latest
      command: ["sleep","10000"]

pod是k8s最小的资源单位

3.2 ReplicationController资源

rc:保证指定数量的pod始终存活,rc通过标签选择器来关联pod

k8s资源的常见操作:
kubectl create -f xxx.yaml
kubectl get pod|rc
kubectl describe pod nginx
kubectl delete pod nginx 或者kubectl delete -f xxx.yaml
kubectl edit pod nginx

创建一个rc

apiVersion: v1               #版本
kind: ReplicationController  #指定创建资源的角色/类型
metadata:				#资源的元数据/属性
  name: nginx			#资源的名字,在同一个namespace中必须唯一
spec:
  replicas: 5           #副本数量5
  selector:
    app: myweb			#标签
  template:				#这里Pod的定义
    metadata:
      labels:
        app: myweb		#Pod的label
    spec:				# 指定该资源的内容
      containers:
      - name: myweb
        image: 10.0.0.11:5000/nginx:1.13
        ports:
        - containerPort: 80
3.2.1 rc的滚动升级

新建一个nginx-rc1.15.yaml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z3mSw8mj-1594286656428)(assets/1563093237250.png)]

升级
kubectl rolling-update nginx -f nginx-rc1.15.yaml --update-period=10s

-f  新版本的yaml

--ipdate-period=10s     升级间隔10s



回滚
kubectl rolling-update nginx2 -f nginx-rc.yaml --update-period=1s

3.3 service资源

service帮助pod暴露端口

创建一个service

apiVersion: v1				#版本
kind: Service		# 指明资源类型是 service
metadata:				
  name: myweb		# service 的名字是 httpd-svc
spec:
  type: NodePort  #ClusterIP
  ports:			
    - port: 80          #clusterIP
      nodePort: 30000   #nodeport
      targetPort: 80    #pod port
  selector:
    app: myweb2	# 指明哪些 label 的 pod 作为 service 的后端

修改nodePort范围

master节点
vim  /etc/kubernetes/apiserver
KUBE_API_ARGS="--service-node-port-range=3000-50000"

systemctl restart kub-apiserver

service默认使用iptables来实现负载均衡, k8s 1.8新版本中推荐使用lvs(四层负载均衡)

3.4 deployment资源

有rc在滚动升级之后,会造成服务访问中断,于是k8s引入了deployment资源

创建deployment

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 10.0.0.11:5000/nginx:1.13
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 100m
          requests:
            cpu: 100m

deployment升级和回滚

#命令行创建deployment

kubectl run   nginx  --image=10.0.0.11:5000/nginx:1.13 --replicas=3 --record

#命令行升级版本

kubectl set image deploy nginx nginx=10.0.0.11:5000/nginx:1.15

#查看deployment所有历史版本

kubectl rollout history deployment nginx

#deployment回滚到上一个版本

kubectl rollout undo deployment nginx

#deployment回滚到指定版本

kubectl rollout undo deployment nginx --to-revision=2

3.5 tomcat+mysql练习

在k8s中容器之间相互访问,通过VIP地址!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hGHKLoBy-1594286656431)(F:\Linux\老男孩文档\image\image-20200709143313499.png)]

4:k8s的附加组件

4.1 dns服务

安装dns服务

1:上传dns_docker镜像包

2:导入dns_docker镜像包(node2节点)

3:导入skydns-rc.yaml\skydns-svc.修改skydns-rc.yaml
#选择部署的nodes几点
spec:
  nodeSelector:
    kubernetes.io/hostname: 10.0.0.13
  containers:  
85行  - --kube-master-url=http://172.16.20.101:8080    改为本机地址。

4:创建dns服务

kubectl  create  -f   skydns-rc.yaml
kubectl  create  -f   skydns-svc.yaml

5:检查

kubectl get all --namespace=kube-system

6:修改所有node节点kubelet的配置文件

vim  /etc/kubernetes/kubelet

KUBELET_ARGS="--cluster_dns=10.254.230.254 --cluster_domain=cluster.local"

systemctl   restart kubelet

4.2 namespace命令空间

namespace做资源隔离

4.3 健康检查

4.3.1 探针的种类

livenessProbe:健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器

readinessProbe:可用性检查,周期性检查服务是否可用,不可用将从service的endpoints中移除

4.3.2 探针的检测方法
  • exec:执行一段命令
  • httpGet:检测某个 http 请求的返回状态码
  • tcpSocket:测试某个端口是否能够连接
4.3.3 liveness探针的exec使用
vi  nginx_pod_exec.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: exec
spec:
  containers:
    - name: nginx
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80
      args:
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
      livenessProbe:
        exec:
          command:
            - cat
            - /tmp/healthy
        initialDelaySeconds: 5
        periodSeconds: 5
4.3.4 liveness探针的httpGet使用
vi   nginx_pod_httpGet.yaml 
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
4.3.5 liveness探针的tcpSocket使用
vi   nginx_pod_tcpSocket.yaml
apiVersion: v1
kind: Pod
metadata:
  name: tcpSocket
spec:
  containers:
    - name: nginx
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80
      livenessProbe:
        tcpSocket:
          port: 80
        initialDelaySeconds: 3
        periodSeconds: 3
4.3.6 readiness探针的httpGet使用
vi   nginx-rc-httpGet.yaml
aapiVersion: 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

4.4 dashboard服务

1:上传并导入镜像,打标签

2:创建dashborad的deployment和service

3:访问http://10.0.0.11:8080/ui/

4.5 通过apiservicer反向代理访问service

第一种:NodePort类型 
type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30008

第二种:ClusterIP类型
 type: ClusterIP
  ports:
    - port: 80
      targetPort: 80

5: k8s弹性伸缩

k8s弹性伸缩,需要附加插件heapster监控

5.1 安装heapster监控

1:上传并导入镜像,打标签

ls *.tar.gz
for n in ls *.tar.gz;do docker load -i $n ;done
docker tag docker.io/kubernetes/heapster_grafana:v2.6.0 10.0.0.11:5000/heapster_grafana:v2.6.0
docker tag docker.io/kubernetes/heapster_influxdb:v0.5 10.0.0.11:5000/heapster_influxdb:v0.5
docker tag docker.io/kubernetes/heapster:canary 10.0.0.11:5000/heapster:canary

2:上传配置文件,kubectl create -f .

修改配置vim heapster-controller.yaml

      containers:
      - name: heapster
        image: 10.0.0.11:5000/heapster:canary
        imagePullPolicy: IfNotPresent

3:打开dashboard验证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R6PDvVyp-1594286656439)(assets/1563681008909.png)]

5.2 弹性伸缩

1:修改rc的配置文件

  containers:
  - name: myweb
    image: 10.0.0.11:5000/nginx:1.13
    ports:
    - containerPort: 80
    resources:
      limits:
        cpu: 100m
      requests:
        cpu: 100m

2:创建弹性伸缩规则

kubectl autoscale -n qiangge replicationcontroller myweb --max=8 --min=1 --cpu-percent=8

3:测试

ab -n 1000000 -c 40 http://172.16.28.6/index.html

扩容截图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xjXbj6go-1594286656443)(assets/1563682793033.png)]

缩容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56dveREr-1594286656445)(assets/1563683030315.png)]

6:持久化存储

pv: persistent volume 全局的资源 pv,node

pvc: persistent volume claim 局部的资源(namespace)pod,rc,svc

6.1:安装nfs服务端(10.0.0.11)

yum install nfs-utils.x86_64 -y
mkdir /data
vim /etc/exports
/data  10.0.0.0/24(rw,async,no_root_squash,no_all_squash)
systemctl start rpcbind
systemctl start nfs

6.2:在node节点安装nfs客户端

yum install nfs-utils.x86_64 -y
showmount -e 10.0.0.11

6.3:创建pv和pvc

#创建pv
[root@k8s-master pv]# cat mysql_pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: tomcat-mysql
  labels:
    type: nfs001
spec:
  capacity:
    storage: 10Gi 
  accessModes:
    - ReadWriteMany 
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: "/data/tomcat"
    server: 172.16.20.101
    readOnly: false
 #创建pv
 kubetcl create -f mysql_pv.yaml
 #查看PV信息
 kubetcl get pv 

#创建pvc
[root@k8s-master pv]# cat mysql_pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: tomcat-mysql
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
 #创建pv
 kubetcl create -f mysql_pvc.yaml
 #查看PV信息
 kubetcl get  pvc

6.4:创建mysql-rc,pod模板里使用volume

#定义mysql pod rc 文件
[root@k8s-master pv]# cat mysql-rc-pvc.yml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: 172.16.20.103:5000/mysql:5.7
          ports:
          - containerPort: 3306
          env:
          - name: MYSQL_ROOT_PASSWORD
            value: '123456'
          volumeMounts:					##挂载设置
          - name: tomcat-mysql			##挂载设备的名字,与volumes[*].name 需要对应
            mountPath: /var/lib/mysql	 ##挂载到容器的某个路径下
      volumes:							##定义一组挂载设备
      - name: tomcat-mysql				 ##定义一个挂载设备的名字
        persistentVolumeClaim:
          claimName: tomcat-mysql		##指定引用PVC名称
#创建mysql pod
kubetcd create -f mysql-rc-pvc.yml 

#定义mysql service VIP 文件       
[root@k8s-master pv]# cat mysql-svc.yml 
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
   - port: 3306
     targetPort: 3306
       selector:
         app: mysql
         

6.5创建tomcat rc service

#自定义tomcat pod rc文件
[root@k8s-master pv]# cat tomcat-rc.yml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 1
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
   - name: myweb
     image: 172.16.20.103:5000/tomcat-app:v2
     ports:
     - containerPort: 8080
       env:
     - name: MYSQL_SERVICE_HOST
       value: 'mysql'
     - name: MYSQL_SERVICE_PORT
       value: '3306'
 #创建tomcat pod
kubetcd create -f tomcat-rc.yml 

#自定义tomcat service VIP 文件
[root@k8s-master pv]# cat tomcat-svc.yml 
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:

   - port: 8080
     nodePort: 30008
       selector:
         app: myweb
#创建tomcat Service 
kubetcd create -f tomcat-svc.yml 

6.6: 验证持久化

验证方法1:删除mysql的pod,数据库不丢

kubectl delete pod mysql-gt054

验证方法2:查看nfs服务端,是否有mysql的数据文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BmevnJdP-1594286656450)(F:\Linux\老男孩文档\image\image-20200418000016240.png)]

6.7: 分布式存储glusterfs

主机名ip地址环境
glusterfs0110.0.0.14centos7.6,内存512M,增加两块硬盘10G,host解析
glusterfs0210.0.0.15centos7.6,内存512M,增加两块硬盘10G,host解析
glusterfs0310.0.0.16centos7.6,内存512M,增加两块硬盘10G,host解析

a: 什么是glusterfs

Glusterfs是一个开源分布式文件系统,具有强大的横向扩展能力,可支持数PB存储容量和数千客户端,通过网络互联成一个并行的网络文件系统。具有可扩展性、高性能、高可用性等特点。

b: 安装glusterfs

所有节点:
yum install  centos-release-gluster -y
yum install  install glusterfs-server -y
systemctl start glusterd.service
systemctl enable glusterd.service
mkdir -p /gfs/test1
mkdir -p /gfs/test2

c: 添加存储资源池

pool   #存储资源池
peer   #节点
volume #卷 start 分布式复制卷
brick  #存储单元(硬盘)
master节点:
gluster pool list
gluster peer probe k8s-node1
gluster peer probe k8s-node2
gluster pool list

d: glusterfs卷管理

创建分布式复制卷
gluster volume create qiangge replica 2 k8s-master:/gfs/test1 k8s-master:/gfs/test2 k8s-node1:/gfs/test1 k8s-node1:/gfs/test2 force
启动卷
gluster volume start qiangge
查看卷
gluster volume info qiangge 
挂载卷
mount -t glusterfs 10.0.0.11:/qiangge /mnt

e: 分布式复制卷讲解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N72BR8ta-1594286656452)(F:\Linux\老男孩文档\image\image-20200418162251447.png)]

f: 分布式复制卷扩容

扩容前查看容量:
df   -h

扩容命令:
gluster volume add-brick qiangge k8s-node2:/gfs/test1 k8s-node2:/gfs/test2 force

扩容后查看容量:
df   -h

6.8 k8s 对接glusterfs存储

a:创建endpoint

vi  glusterfs-ep.yaml
apiVersion: v1
kind: Endpoints
metadata:
  name: glusterfs
  namespace: default
subsets:
- addresses:
  - ip: 10.0.0.14
  - ip: 10.0.0.15
  - ip: 10.0.0.16
  ports:
  - port: 49152
    protocol: TCP

b: 创建service

vi  glusterfs-svc.yaml
aapiVersion: v1
kind: Service
metadata:
  name: glusterfs
  namespace: default
spec:
  ports:
  - port: 49152
    protocol: TCP
    targetPort: 49152
  sessionAffinity: None
  type: ClusterIP

c: 创建gluster类型pv

vi  gluster_pv.yaml
aapiVersion: v1
kind: PersistentVolume
metadata:
  name: gluster
  labels:
    type: glusterfs
spec:
  capacity:
    storage: 50Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs"
    path: "qiangge"
    readOnly: false

d: 创建pvc

e:在pod中使用gluster

vi  nginx_pod.yaml
…… 
volumeMounts:
        - name: nfs-vol2
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-vol2
        persistentVolumeClaim:
          claimName: gluster

7:与jenkins集成实现ci/cd

ip地址服务内存
10.0.0.11kube-apiserver 80801G
10.0.0.13k8s-node22G
10.0.0.14jenkins(tomcat + jdk) 8080 + kubelet1G
10.0.0.15gitlab 8080,802G

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ph51e8Uo-1594286656454)(assets/1564559266936.png)]

7.1: 安装gitlab并上传代码

#a:安装
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.9.11-ce.0.el7.x86_64.rpm
yum localinstall gitlab-ce-11.9.11-ce.0.el7.x86_64.rpm -y
#b:配置
vim /etc/gitlab/gitlab.rb
external_url 'http://10.0.0.15'
prometheus_monitoring['enable'] = false
#c:应用并启动服务
gitlab-ctl reconfigure

#使用浏览器访问http://10.0.0.15,修改root用户密码,创建project

#上传代码到git仓库
cd /srv/
rz -E
unzip xiaoniaofeifei.zip 
rm -fr xiaoniaofeifei.zip 

git config --global user.name "Administrator"
git config --global user.email "admin@example.com"
git init
git remote add origin http://10.0.0.15/root/xiaoniao.git
git add .    #增加文件
git commit -m "Initial commit"   #备注信息
git push -u origin master        #上传到master

yum install docker -y
vim dockerfile
FROM  10.0.0.11:5000/nginx:1.13
ADD .  /usr/share/nginx/html
git add .
git commit -m "add dockerfile"
git push -u origin master

7.2 安装jenkins,并自动构建docker镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHuYOQV2-1594286656457)(F:\Linux\老男孩文档\image\image-20200419000002035.png)]

1:安装jenkins
cd /opt/
rz -E
rpm -ivh jdk-8u102-linux-x64.rpm 
mkdir /app
tar xf apache-tomcat-8.0.27.tar.gz -C /app
rm -fr /app/apache-tomcat-8.0.27/webapps/*
mv jenkins.war /app/apache-tomcat-8.0.27/webapps/ROOT.war
tar xf jenkin-data.tar.gz -C /root
/app/apache-tomcat-8.0.27/bin/startup.sh 
netstat -lntup
2:访问jenkins

访问http://10.0.0.12:8080/,默认账号密码admin:123456

3:配置jenkins拉取gitlab代码凭据

a:在jenkins上生成秘钥对

ssh-keygen -t rsa

b:复制公钥粘贴gitlab上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1vnHOAUC-1594286656465)(F:\Linux\老男孩文档\image\image-20200419174505639.png)]

c:jenkins上创建全局凭据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PmBMlXEa-1594286656468)(F:\Linux\老男孩文档\image\image-20200419174521094.png)]

4:拉取代码测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yC7n3KWz-1594286656471)(F:\Linux\老男孩文档\image\image-20200419174542713.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-onw68CWv-1594286656472)(F:\Linux\老男孩文档\image\image-20200419174604996.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zmXMYXA-1594286656474)(F:\Linux\老男孩文档\image\image-20200419174722473.png)]

5:编写dockerfile并测试
#vim dockerfile
FROM 10.0.0.11:5000/nginx:1.13
add .  /usr/share/nginx/html

#添加docker build构建时不add的文件
vim .dockerignore
dockerfile

docker build -t xiaoniao:v1 .
docker run -d -p 88:80 xiaoniao:v1

打开浏览器测试访问xiaoniaofeifei的项目

6:上传dockerfile和.dockerignore到私有仓库

git add docker .dockerignore
git commit -m “fisrt commit”
git push -u origin master

7:点击jenkins立即构建,自动构建docker镜像并上传到私有仓库

修改jenkins 工程配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZoAwmpnJ-1594286656475)(assets/1563702843438.png)]

docker build -t 10.0.0.11:5000/test:v B U I L D I D . d o c k e r p u s h 10.0.0.11 : 5000 / t e s t : v BUILD_ID . docker push 10.0.0.11:5000/test:v BUILDID.dockerpush10.0.0.11:5000/test:vBUILD_ID

7.3 jenkins自动部署应用到k8s

kubectl -s 10.0.0.11:8080 get nodes

if [ -f /tmp/xiaoniao.lock ];then
	docker  build  -t  10.0.0.11:5000/xiaoniao:v$BUILD_ID  .
	docker  push 10.0.0.11:5000/xiaoniao:v$BUILD_ID
	kubectl -s 10.0.0.11:8080 set image  -n xiaoniao deploy xiaoniao xiaoniao=10.0.0.11:5000/xiaoniao:v$BUILD_ID
	echo "更新成功"
else
	docker  build  -t  10.0.0.11:5000/xiaoniao:v$BUILD_ID  .
	docker  push 10.0.0.11:5000/xiaoniao:v$BUILD_ID
	kubectl  -s 10.0.0.11:8080  create  namespace  xiaoniao
	kubectl  -s 10.0.0.11:8080  run   xiaoniao  -n xiaoniao  --image=10.0.0.11:5000/xiaoniao:v$BUILD_ID --replicas=3 --record
	kubectl  -s 10.0.0.11:8080   expose -n xiaoniao deployment xiaoniao --port=80 --type=NodePort
	port=`kubectl -s 10.0.0.11:8080  get svc -n xiaoniao|grep -oP '(?<=80:)\d+'`
	echo "你的项目地址访问是http://10.0.0.13:$port"
	touch /tmp/xiaoniao.lock
fi

jenkins一键回滚

kubectl -s 10.0.0.11:8080 rollout undo -n xiaoniao deployment xiaoniao

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值