通过Rancher管理K8S集群

1.Rancher简介

Rancher是一套容器管理平台,它可以帮助组织在生产环境中轻松快捷的部署个管理容器。Rancher可以轻松地管理各种环境的Kubernetes,满足IT需求并为Devops团队提供支持。
Rancher不仅已经成为容器编排的标准,它也正在迅速成为各类云和虚拟化厂商提供的标准基础架构。Rancher用户可以选择使用Rancher Kubernetes Engine(RKE)创建Kubernetes集群,也可以使用GKE,AKS和EKS等云Kubernetes服务。Rancher可以还可以导入和管理现有的Kubernetes集群。
官网: https://rancher.com/; https://www.rancher.cn/
Rancher为Devops工程师提供了一个直观的用户界面来管理他们的服务器,用户不需要深入了解Kubernetes概念就可以开始使用Rancher。Rancher包含应用商店,支持一键部署Compose模板。

2 Rancher四个组成部分

1.基础实施编排

Rancher可以使用任何公有云或者私有云的Linux主机资源。Linux主机可以是虚拟机,也可以说物理机。

2.容器编排与调度

很多用户都会选择使用容器编排调度框架来运行容器化应用。Rancher包含了当前全部主流的编排调度引擎,例如Docker Swarm, Kubernetes, 和Mesos。同一个用户可以创建Swarm或者Kubernetes集群。并且可以使用原生的Swarm或者Kubernetes工具管理应用。

除了Swarm,Kubernetes和Mesos之外,Rancher还支持自己的Cattle容器编排调度引擎。Cattle被广泛用于编排Rancher自己的基础设施服务以及用于Swarm集群,Kubernetes集群和Mesos集群的配置,管理与升级。

3.应用商店

Rancher的用户可以在应用商店里一键部署由多个容器组成的应用。用户可以管理这个部署的应用,并且可以在这个应用有新的可用版本时进行自动化的升级。Rancher提供了一个由Rancher社区维护的应用商店,其中包括了一系列的流行应用。Rancher的用户也可以创建自己的私有应用商店。

4.企业级权限管理

Rancher支持灵活的插件式的用户认证。支持Active Directory,LDAP,Github等认证方式。

3.本章拓扑

4. 安装Rancher

在k8s-rancher上操作

4.1 初始化实验环境

# 1.配置主机名
[root@10-23-91-231 ~]# hostnamectl set-hostname  k8s-rancher
[root@10-23-91-231 ~]# bash
[root@k8s-rancher ~]# 

# 2.配置hosts文件
k8s主机上和rancher主机 hosts文件要保持一致
[root@k8s-master1 ~]# tail -4 /etc/hosts
10.23.103.224 k8s-master1 
10.23.33.49   k8s-node1 
10.23.46.210  k8s-node2 
10.23.91.23   k8s-rancher
[root@k8s-master1 ~]# 

# 3.配置rancher到k8s主机互信(非必须)
[root@k8s-rancher ~]# ssh-keygen  -t rsa
[root@k8s-rancher ~]#  ssh-copy-id k8s-master1
[root@k8s-rancher ~]#  ssh-copy-id k8s-node1
[root@k8s-rancher ~]#  ssh-copy-id k8s-node2

# 4.关闭防火墙
[root@k8s-rancher ~]# systemctl stop firewalld ; systemctl disable firewalld

# 5.关闭selinux
[root@k8s-rancher ~]# setenforce 0
[root@k8s-rancher ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# 6.关闭swap
#临时关闭
[root@k8s-rancher ~]# swapoff -a
[root@k8s-rancher ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3735         192        3215          16         328        3307
Swap:             0           0           0
#永久关闭
[root@k8s-rancher ~]# vim /etc/fstab 
#注释掉swap这行

# 7.内核参数修改;br_netfilter模块用于将桥接流量转发至iptables链,br_netfilter内核参数需要开启转发。
[root@k8s-rancher ~]# modprobe  br_netfilter
[root@k8s-rancher ~]# echo "modprobe br_netfilter" >> /etc/profile
[root@k8s-rancher ~]# 
[root@k8s-rancher ~]# cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@k8s-rancher ~]# sysctl --system

4.2 安装docker环境

# 1.安装docker-ce环境依赖
[root@k8s-rancher ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

# 2.配置docker-ce的国内yum源
[root@k8s-rancher ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 3.安装软件包
[root@k8s-rancher ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack ntpdate telnet

# 4.安装docker-ce
[root@k8s-rancher ~]# yum install docker-ce docker-ce-cli containerd.io -y
[root@k8s-rancher ~]# systemctl start docker && systemctl enable docker.service

# 5.配置镜像加速器
tee /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com", "https://rncxm540.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
} 
EOF

[root@k8s-rancher ~]# systemctl daemon-reload
[root@k8s-rancher ~]# systemctl restart docker

4.3 安装Rancher

Rancher2.5.7支持k8s1.20.4,所以我们安装rancher2.5.7版本,

#将制作好的镜像包上传到服务器上,为了快速部署(非必须)

查看rancher镜像详细信息
docker inspect rancher/rancher:v2.5.7

从中可以看出一些对我们有用的环境变量Env,以及数据卷Volumes等一般在Dockerfile构建中的参数。显而易见,rancher镜像主要有两个volume目录,默认方式是采用匿名卷的方式。接下来我们使用挂载到指定的主机目录方式来进行数据卷持久化同时启动rancher。

执行如下命令,在宿主机创建两个挂载目录
[root@k8s-rancher ~]# mkdir -p /docker_volume/rancher_home/rancher
[root@k8s-rancher ~]# mkdir -p /docker_volume/rancher_home/auditlog

启动rancher容器
docker run -d --restart=unless-stopped -p 80:80 -p 443:443 \
-v /docker_volume/rancher_home/rancher:/var/lib/rancher \
-v /docker_volume/rancher_home/auditlog:/var/log/auditlog \
--privileged \
--name rancher rancher/rancher:v2.5.7

# 验证rancher是否启动:

[root@k8s-rancher ~]# docker ps|grep rancher
c9452f944f24   rancher/rancher:v2.5.7   "entrypoint.sh"   43 seconds ago   Up 43 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   rancher
[root@k8s-rancher ~]# 

4.4 登录Rancher平台

在浏览器访问外网地址或者内网地址

https://113.31.102.195


如果大家用英文不方面,可以把页面字体变成中文,方法如下:

5 通过Rancher管理已存在的k8s集群

#把已经存在的k8s集群导入到rancher了

选择导入,出现如下:

点击创建之后出现如下提示:

在k8s控制节点k8s-master上执行上面箭头所指的命令,如下所示,执行:

[root@k8s-master1 ~]# curl --insecure -sfL https://113.31.102.195/v3/import/pgq8j24zbxjghvqk2hgk5pqj4gr7r2hfj42chmc2bpd2wdwzlr4g9n_c-8sz6f.yaml | kubectl apply -f -
clusterrole.rbac.authorization.k8s.io/proxy-clusterrole-kubeapiserver created
clusterrolebinding.rbac.authorization.k8s.io/proxy-role-binding-kubernetes-master created
namespace/cattle-system created
serviceaccount/cattle created
clusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding created
secret/cattle-credentials-55b0282 created
clusterrole.rbac.authorization.k8s.io/cattle-admin created
deployment.apps/cattle-cluster-agent created
[root@k8s-master1 ~]# 

在回到主页面可以看到rancher已经成功导入k8s1.20.5版本了

6.使用Rancher中自带的监控功能查看k8s集群运行状态

启动监控时间可能比较长,需要等10-20分钟
在rancher主页面,点击集群名称hebye-kubernetes

启动监控并查看实时监控指标

组件版本用0.2.1,其他默认就可以了,点最后:启用监控

要等待监控API就绪,才可以显示出来

此处,需要等待20分钟,等待集群把监控API安装上。
在这个里可以查看过安装的过程:

具体事件如下:

看到这个界面后,再等待15分钟,让集群把grafana组件安装上。查看事件:

可以看到已经开始在安装grafana相关组件了。

刷新当前页面,监控部署完成后就可以看到我们的监控信息了。

我们点开集群监控,选择时间为五分钟,因为默认是一小时,而我们刚刚开启监控图标还没有足够的数据。

7.查看Grafana监控

我们可以点击每个项目上的Grafana图标即可跳转到Grafana监控页面

点击后我们可以跳转到Grafana监控界面

8.通过Rncher仪表盘管理k8s-部署web站点

打开rancher主页面

  • 1、创建名称空间

点击仪表盘

点击Namespace:

点击创建:

把Namespace名称写上,其他默认即可,点击创建

  • 2、创建Deployment资源

点击创建:

添加标签:

容器配置:

#指定镜像

#给pod打上标签

容器配置完成,点击创建;
查看资源是否创建成功:

查看tomcat详细信息

  • 3、创建Service资源,把k8s集群内部的tomcat暴露出来


选择节点端口

#定义服务端口

#定义选择器

创建
查看service是否创建成功

点击节点端口 30180/TCP,可以访问内部的tomcat了

(访问 外网的 http://113.31.107.91:31080/)

9.实战-分布式LNMP环境部署电商网站

为了方便同学们理解K8S中集群服务是如何工作的,究竟服务是以什么方式进行通讯的,所以我们实践搭建LNMP环境来深入体验。

9.1 安装kubectl

  • 在线安装(在k8s-rancher服务器上)
[root@k8s-rancher ~]# curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
[root@k8s-rancher ~]# chmod  +x kubectl  
[root@k8s-rancher ~]# mv kubectl  /usr/local/bin/kubectl
  • 创建kubectl配置文件

复制配置文件到剪切板

[root@k8s-rancher ~]# mkdir ~/.kube
#粘贴配置文件,注意粘贴时检查文件头是否缺少。
[root@k8s-rancher ~]# vim ~/.kube/config

#测试kubectl命令
[root@k8s-rancher ~]# kubectl config get-contexts 
CURRENT   NAME              CLUSTER           AUTHINFO          NAMESPACE
*         hebye-kubetnets   hebye-kubetnets   hebye-kubetnets   
[root@k8s-rancher ~]# 
[root@k8s-rancher ~]# kubectl get nodes
NAME          STATUS   ROLES    AGE   VERSION
k8s-master1   Ready    <none>   27d   v1.20.5
k8s-node1     Ready    <none>   38d   v1.20.5
k8s-node2     Ready    <none>   38d   v1.20.5
[root@k8s-rancher ~]# 

9.2 部署nfs共享存储和pv

说明:服务器NFS部署 在 k8s-node2 上 10.23.46.210
如果没有安装NFS,可以执行一下命令

yum -y install nfs-utils rpcbind
systemctl start nfs
systemctl enable nfs
  • 创建数据目录
[root@k8s-node2 ~]# mkdir -p /web/{html,data}
[root@k8s-node2 ~]# tree /web/
/web/
├── data
└── html
  • 配置NFS
[root@k8s-node2 ~]# cat /etc/exports
/nfs/data/ *(insecure,rw,sync,no_root_squash) #省略,此配置是用来做sc使用的
/web/html *(insecure,rw,sync,no_root_squash)
/web/data *(insecure,rw,sync,no_root_squash)
[root@k8s-node2 ~]# 

[root@k8s-node2 ~]# exportfs  -arv
exporting *:/web/data
exporting *:/web/html
exporting *:/nfs/data
[root@k8s-node2 ~]# 

*:表示任何人都有权限连接,当然也可以是一个网段,一个 IP,也可以是域名
rw:读写的权限
sync:表示文件同时写入硬盘和内存
no_root_squash:当登录 NFS 主机使用共享目录的使用者是 root 时,其权限将被转换成为匿名使用者,通常它的 UID 与 GID,都会变成 nobody 身份

9.3 k8s的pv与pvc持久化存储

PersistenVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理
PersistentVolumeClaim(PVC):让用户不需要关心具体的Volume实现细节。
总的来说,PV是提供者,PVC是消费者,消费的过程就是绑定。容器与PV、PVC之间的关系:
PVC:我需要一个5GiB的权限是读写的pv
PV:定义出一个5Gib权限是读写的pv

# 解析资源文件(提前准备好的,包含ecshop文件,传输到nfs目录)
[root@k8s-node2~]# tar xf lnmp-v9.tar.gz
[root@k8s-node2~]# cd lnmp
[root@k8s-node2 lnmp]# unzip ecshop.zip
[root@k8s-node2 ~]# mv ecshop/* /web/html/
  • 创建pv
[root@k8s-rancher lnmp]# cat pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  labels:
    apps: mysql-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /web/data
    server: 10.23.46.210
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: web-pv
  labels:
    apps: web-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /web/html
    server: 10.23.46.210
[root@k8s-rancher lnmp]# kubectl apply  -f pv.yaml 
persistentvolume/mysql-pv created
persistentvolume/web-pv created
[root@k8s-rancher lnmp]# 

注:pv.yaml一共创建了2个pv分别是mysql-pv、web-pv
ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
ReadOnlyMany(ROX):只读权限,可以被多个节点挂载
ReadWriteMany(RWX):读写权限,可以被多个节点挂载

PV描述的是持久化存储卷,主要定义的是一个持久化存储在宿主机上的目录,比如一个NFS的挂载目录。
PVC描述的是Pod所希望使用的持久化存储的属性,比如,Volume存储的大小、可读写权限等等。
使用过程是: nfs→pv→pvc→volume→volumeMount to path

9.4 部署PHP服务

  • 构建PHP镜像
[root@k8s-rancher php]# cat Dockerfile 
FROM centos:7.6.1810
MAINTAINER hebye "hebye.com"
RUN yum makecache && \
    yum -y install php-fpm php php-gd php-mysql php-mbstring php-xml php-mcrypt  php-imap php-odbc php-pear php-xmlrpc && \
    sed -i 's/listen = 127.0.0.1:9000/listen = 0.0.0.0:9000/' /etc/php-fpm.d/www.conf && \
    sed -i 's/listen.allowed_clients = 127.0.0.1/;listen.allowed_clients = 127.0.0.1/' /etc/php-fpm.d/www.conf
EXPOSE 9000
CMD ["/sbin/php-fpm"]
[root@k8s-rancher php]# docker build . -t hebye/php:v1

[root@k8s-rancher php]# docker push hebye/php:v1
  • 部署php-deployment
[root@k8s-rancher lnmp]# cat php-deployment.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-server
  labels:
    name: php-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-server
  template:
    metadata:
      labels:
        app: php-server
    spec:
      containers:
      - name: php-server
        image: hebye/php:v1
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: php-data
          mountPath: /var/www/html/
        ports:
        - containerPort: 9000
        lifecycle:
          postStart:
            exec:
              command: [ "/bin/bash","-c","chown apache.apache /var/www/html -R" ]
      volumes:
      - name: php-data
        persistentVolumeClaim:
          claimName: web-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: web-pvc
  labels:
    app: php-server
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      apps: web-pv
[root@k8s-rancher lnmp]# 


[root@k8s-rancher lnmp]# kubectl apply  -f php-deployment.yaml 
deployment.apps/php-server created
persistentvolumeclaim/web-pvc created
[root@k8s-rancher lnmp]# kubectl get pods
NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-76ccfcb6d7-ts7z8   1/1     Running   4          4d
php-server-66b577bfdf-zzttz   
  • 部署 php-svc
[root@k8s-rancher lnmp]# cat php-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: php
spec:
  ports:
  - name: php
    port: 9000
    protocol: TCP
  selector:
    app: php-server
[root@k8s-rancher lnmp]# kubectl apply  -f php-svc.yaml 
service/php created

[root@k8s-rancher lnmp]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP             39d
php          ClusterIP   10.0.0.10    <none>        9000/TCP            3s

9.5 部署nginx服务

配置文件注意事项,该配置文件是通过yum安装nginx获取的,课程内nginx镜像也是使用centos镜像通过yum的方式安装的nginx,同学们需要注意其它Linux发行版中的Nginx配置方式是有区别的,课程资料中提供了nginx镜像制作的Dockerfile可自行查阅。

  • 构建Nginx镜像
[root@k8s-rancher nginx]# cat Dockerfile 
FROM centos:7.6.1810
MAINTAINER hebye "hebye.com"
RUN yum -y install epel-release && \ 
    yum -y install net-tools vim wget pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop && \
    yum -y install nginx 
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
[root@k8s-rancher nginx]# 

[root@k8s-rancher nginx]# docker build -t . hebye/nginx:v1
[root@k8s-rancher nginx]# docker push hebye/nginx:v1
  • 配置configmap
[root@k8s-rancher lnmp]# cat /root/lnmp/conf/nginx.conf 
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;
        location / {
            index index.php;
        }
        location ~ \.php$ {
        #    root           html;
            fastcgi_pass   php:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
            include        fastcgi_params;
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

[root@k8s-rancher lnmp]# 

注:nginx的站点根目录是/usr/share/nginx/html而php的解析目录是/var/www/html/两者仅仅是挂载到容器中的路径不一样,但是同源。fastcgi_pass 指定后端php解析地址时只需要指定php-svc的名称即可

ConfigMap创建nginx配置文件
ConfigMap简单介绍:ConfigMap是k8s中非常重要的一个资源对象,简称cm,常用于向容器中注入配置文件等操作,不仅可以保存单个属性值,也可以保存整个配置文件。
语法格式: kubectl create configmap name –from-file=path

[root@k8s-rancher lnmp]# kubectl create configmap lnmp-nginx-config --from-file=/root/lnmp/conf/nginx.conf 
configmap/lnmp-nginx-config created
[root@k8s-rancher lnmp]# 
  • 创建nginx-deployment
[root@k8s-rancher lnmp]# cat nginx-deployment.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-shop
spec:
  selector:
    matchLabels:
      app: nginx-shop
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx-shop
    spec:
      containers:
      - name: nginx-shop
        image: hebye/nginx:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-data
          mountPath: /usr/share/nginx/html
        - name: nginx-conf
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
      - name: nginx-data
        persistentVolumeClaim:
          claimName: web-pvc
      - name: nginx-conf
        configMap:
          name: lnmp-nginx-config
[root@k8s-rancher lnmp]# kubectl apply  -f nginx-deployment.yaml 
deployment.apps/nginx-shop created
[root@k8s-rancher lnmp]# 
[root@k8s-rancher lnmp]# kubectl get pods
NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-76ccfcb6d7-ts7z8   1/1     Running   4          4d
nginx-shop-7dfb87cf9f-89t87               1/1     Running   0          17s
php-server-66b577bfdf-zzttz               1/1     Running   0          10m
  • 创建nginx-svc
[root@k8s-rancher lnmp]# cat nginx-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-shop
spec:
  type: NodePort
  ports:
  - name: nginx
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 31080
  selector:
    app: nginx-shop
[root@k8s-rancher lnmp]# kubectl apply  -f nginx-svc.yaml 
service/nginx-shop created
[root@k8s-rancher lnmp]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP             39d
nginx-shop   NodePort    10.0.0.212   <none>        80:31080/TCP        5s
php          ClusterIP   10.0.0.10    <none>        9000/TCP            9m57s
tomcat       ClusterIP   10.0.0.160   <none>        8080/TCP,8009/TCP   4d10h
[root@k8s-rancher lnmp]# 

注:nginx-svc增加了nodePort对外提供服务。
访问测试:http://113.31.168.173:31080/

可以看到安装界面则表示php解析正确没有问题。现在不要部署网站,因为还没有安装数据库了。

9.6 部署mysql服务

[root@k8s-rancher lnmp]# cat mysql-deployment.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: default
  labels:
    k8s-app: mysql
spec:
  selector: 
    matchLabels:
      k8s-app: mysql
  replicas: 1
  template:
    metadata:
      labels:
        k8s-app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3306
          protocol: TCP
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        env:
          - name: MYSQL_ROOT_PASSWORD
            value: "123456"
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  labels:
    k8s-app: mysql
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      apps: mysql-pv
[root@k8s-rancher lnmp]# 
[root@k8s-rancher lnmp]# kubectl apply  -f mysql-deployment.yaml 
deployment.apps/mysql created
persistentvolumeclaim/mysql-pvc created
[root@k8s-rancher lnmp]# 
[root@k8s-rancher lnmp]# kubectl get pods
NAME                                      READY   STATUS    RESTARTS   AGE
mysql-68786b5644-ktsxl                    1/1     Running   0          13s
[root@k8s-rancher lnmp]# cat mysql-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    k8s-app: mysql
spec:
  ports:
  - name: mysql
    port: 3306
    protocol: TCP
    targetPort: 3306
  selector:
    k8s-app: mysql
[root@k8s-rancher lnmp]# kubectl apply  -f mysql-svc.yaml 
service/mysql created
[root@k8s-rancher lnmp]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP             39d
mysql        ClusterIP   10.0.0.7     <none>        3306/TCP            2s

mysql容器中存在初始化脚本,使用MYSQL_ROOT_PASSWORD变量配置mysql登录密码。

10.实战-ingress-对外发布服务

发布服务是通过反向代理实现的,也就是通过nginx反向代理我们k8s中的服务,有些同学会想那nginx代理我们的服务了,那ingress到底是做什么的?原因很简单,nginx并不能实时监测我们后端pod的变化,比如增加或减少后端服务需要手工修改nginx配置,而ingress有一个监听器可以通过监听kube-apiserver来感知后端的servcice、pod变化。然后根据ingress的配置将后端信息更新给我们的反向代理。
工作原理:域名解析指向集群边缘节点,然后ingress匹配域名规则将请求转发至对应的服务。
扩展:边缘节点
边缘节点是指我们k8s集群中对外提供服务的节点,因为k8s集群如果每一台主机都拥有公网IP的话其实是没有必要的,通常我们只需要边缘节点能够对外提供服务就可以了。此时我们发布服务时只要把域名解析指向边缘节点的ip就可以访问k8s中的服务。

注:rancher中自带了服务发布的功能,是通过nginx实现的,如果是自建的k8s集群则建议使用Traefik。

  • 创建ingress规则


创建名称hebye-shop→自定义域名→shop.hebye.com

添加服务(service):

服务选择nginx-shop端口选择nginx即可,
注:端口名称nginx是service ports name,调用时可以使用端口也可以直接使用名称。

直接将域名解析到ingress控制器即可。

浏览器访问:http://shop.hebye.com

文档更新时间: 2021-11-16 21:30   作者:xtyang