Rancher

1、rancher简介

Rancher ['rantfe®] 牧场主
Rancher简介
Rancher是一套容器管理平台,它可以帮助组织在生产环境中轻松快捷的部署和管理容器。 Rancher可以轻松地管理各种环境的Kubernetes,满足IT需求并为DevOps团队提供支持。

Kubernetes不仅已经成为的容器编排标准,它也正在迅速成为各类云和虚拟化厂商提供的标准基础架构。Rancher用户可以选择使用Rancher Kubernetes Engine(RKE)创建Kubernetes集群,也可以使用GKE,AKS和EKS等云Kubernetes服务。Rancher用户还可以导入和管理现有的 Kubernetes集群。

扩展:GKE:Google Kubernetes Engine,Google的k8s托管服务 AKS:Azure
Kubernetes服务(AKS),微软的k8s托管服务 EKS:Amazon Elastic Container Service for
Kubernetes,Amazon的K8S 托管服务

Rancher为DevOps工程师提供了一个直现的用户界面来管理他们的服务容器,用户不需要深入了解Kubernetes概念就可以开始使用Rancher。Rancher包含应用商店,支持一键式部署Compose模板。
扩展:docker-compose是Docker容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用docker-compose不再需要使用shell 脚本来启动容器。
Compose [kem’pэuz] 组成
docker-compose默认的模板文件是docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或build指令(需要Dockerfile)来自动构建。e
官网:https://rancher.com/;https://wwwrancher.cn/<官方文档:https://ranchercom/docs/rancher/v1.6/zh/e

Rancher四个组成部分
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等认证方式。

实验拓扑图:
都需要安装docker;此处准备了三台机器,rancher和主节点以及工作节点;
Rancher_第1张图片

2、使用rancher搭建k8s集群

实验:
1、在每台机器安装docker;
2、在rancher机器上安装rancher平台

安装rancher平台其实很简单,只需下载rancher的镜像,然后运行起来就可以了。需要注意的是 rancher2x版本的镜像是rancher/rancher端口添加了443端口。之前rancher 1.6版本使用的docker镜像是rancher/server。
此处的rancher安装包包含了k8s的主节点和工作节点的一些镜像;
Rancher_第2张图片
3、在机器上导入镜像:docker load -i rancher_257_v1.tar.gz;每台机器都导入
查看导入了30个的镜像;
在这里插入图片描述
4、启动rancher镜像

docker run -d--restart=unless-stopped-p 80:80-p 443:443-- privileged rancher/ranchere

注:–restart=unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器(就是rancher崩了,能自动重启)
5、rancher容器起来后浏览器访问:
Rancher_第3张图片

Rancher_第4张图片
到此界面就成功搭建了rancher
Rancher_第5张图片
Rancher_第6张图片
在网页的右下角,设置网页显示的语言为“简体中文”
Rancher_第7张图片

注:新版本默认会安装k3s集群,k3s是轻量级的k8s,多用于物联网的边缘计算。
6、通过rancher来搭建k8s集群
6.1、添加集群
Rancher_第8张图片
6.2创建新的k8s集群
Rancher_第9张图片
6.3点击自定义创建新的k8s集群
Rancher_第10张图片
6.4、k8s版本选择与网络驱动以及镜像私有库等
Rancher_第11张图片
Rancher_第12张图片
Rancher_第13张图片
7、接着是添加主节点
Rancher_第14张图片
然后把命令在主节点执行:(执行该命令就需要把selinux和防火墙关了)在这里插入图片描述
这里还没有好,只是把rancher-Agent起来了;通过rancher-Agent联系rancher那台机器(有那个tocken就能和rancher那台机器交互了,以及对应的ca证书);告诉rancher那台机器,要成为etcd,controlplane,worker 角色;然后rancher会告诉其需要成为该角色需要起的哪些镜像以及参数有哪些。
启动成功我们的web界面是:
Rancher_第15张图片
可以点击此处查看主节点的安装程度:
Rancher_第16张图片

进入后:
Rancher_第17张图片
尽管此处up主已经提供rancher-Agent,但是其他镜像还是从海外下载。
8、创建我们的工作节点:
8.1找到创建工作节点的路径:
Rancher_第18张图片
8.2进入后拉到此处:
Rancher_第19张图片
8.3去工作节点的终端执行上图的
Rancher_第20张图片
8.4、回到web界面查看:出现“一台新主机注册成功”再点击保存;
Rancher_第21张图片
8.5:需要等待时间创建:
Rancher_第22张图片

Rancher_第23张图片

2、使用rancher中自带的监控功能

启用 Rancher 集群级别监控
需要等节点都准备就绪后再开启监控功能:
Rancher_第24张图片
要等待监控 API 就绪,才可以显示出来
Rancher_第25张图片
此处,需要等待 20 分钟,等待集群把监控 API 安装上。
在这个里可以查看过安装的过程:
Rancher_第26张图片
注:这里显示监控 API 未就绪,需要等 10 分钟左右,才可以安装完并就绪。
具体事件如下:
Rancher_第27张图片
注:安装监控插件时,需要注意硬件资源是不是够用。如果不够使用,是安装不成功的。
Rancher_第28张图片
看到这个界面后,再等待 15 分钟,让集群把 grafana 组件安装上。查看事件:
Rancher_第29张图片
可以看到已经开始在安装 grafana 相关组件了。
刷新当前页面,监控部署完成后就可以看到我们的监控信息了。
Rancher_第30张图片
我们点开集群监控,选择时间为五分钟,因为默认是一小时,而我们刚刚开启监控图标还没有足够的数据。
Rancher_第31张图片
点击后我们可以跳转到 Grafana 监控界面
Rancher_第32张图片
Rancher_第33张图片

4、 实战-分布式 LNMP 环境部署电商网站

在rancher机器上安装 kubectl
1、下载kubectl文件

离线安装
上传课程资料中的 kubectl
[root@xuegod63 ~]# chmod +x kubectl && mv kubectl /usr/local/bin/kubectl
或:在线安装 kubectl
[root@xuegod63 ~]# tee /etc/yum.repos.d/kubernetes.repo << 'EOF'
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg 
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@xuegod63 ~]# yum install -y kubectl

2、创建 kubectl 配置文件
Rancher_第34张图片
3、复制配置文件到剪切板
Rancher_第35张图片

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

Rancher_第36张图片
4、测试 kubectl 命令

[root@xuegod63 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
xuegod62 Ready controlplane,etcd,worker 43m v1.20.4
xuegod64 Ready worker 23m v1.20.4

部署 nfs 共享存储和 pv

实验背景说明:nginx 和 php 不在一台机器上,怎么运行?
nginx pod 192.168.1.71 192.168.1.62/data/2.php -> php 
php pod 192.168.1.72 找不到网站根下找不/data/2.php ,不能解析!
注:nginx 转给 php 服务是一个 php 脚本的路径,不是脚本内容!
必须把 nginx 网站根共享给 php 所在的服务器,而且路径要一样。
mysql  pod

创建数据卷

[root@xuegod63 ~]# mkdir -p /web/{html,data}
注:生产环境可以使用 raid 来保证数据可靠性。
[root@xuegod63 ~]# yum -y install nfs-utils rpcbind #安装 nfs
[root@xuegod63 ~]# vim /etc/exports
/web/html *(rw,no_root_squash)
/web/data *(rw,no_root_squash)

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

先配置开机自启并立即启动 rpcbind,才能做pv

[root@xuegod63 ~]# systemctl enable --now rpcbind
配置开机自启并立即启动 nfs(注意启动顺序,必须先启动 rpcbind)
[root@xuegod63 ~]# systemctl enable --now nfs

概念: k8s 的 pv 与 pvc 持久化存储(可以看之前k8s学习的)

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

Rancher_第37张图片
解压资源文件


[root@xuegod63 ~]# tar xf lnmp-v9.tar.gz
[root@xuegod63 ~]# cd lnmp
[root@xuegod63 lnmp]# unzip ecshop.zip
[root@xuegod63 ~]# mv ecshop/* /web/html/
[root@xuegod63 lnmp]# vim /root/lnmp/pv.yaml #查看我准备好的 pv 文件

注: kind: PersistentVolume ;种类:持久卷 Persistent [pəˈsɪstənt] 持久的
Rancher_第38张图片
创建 pv

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

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

[root@xuegod63 ~]# kubectl api-resources #"组/版本"的格式输出对象支持的 API 版本

版本怎么写,用这个命令查
Rancher_第40张图片

Rancher_第41张图片
[root@xuegod63 lnmp]# vim php-deployment.yaml
Rancher_第42张图片
Rancher_第43张图片
部署 php-deployment

[root@xuegod63 lnmp]# kubectl apply -f php-deployment.yaml
deployment.apps/php-server created
[root@xuegod63 lnmp]# kubectl get pod
NAME READY STATUS RESTARTS AGE
php-server-7688967d96-lx74j 1/1 Running 0 9s

部署 php-svc

[root@xuegod63 lnmp]# vim php-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
 name: php
spec:
 ports:
 - name: php
 port: 9000
 protocol: TCP
 targetPort: 9000
 selector:
 app: php-server
[root@xuegod63 lnmp]# kubectl apply -f php-svc.yaml
service/php created

部署 nginx 服务

配置文件注意事项,该配置文件是通过 yum 安装 nginx 获取的,课程内 nginx 镜像也是使用
centos 镜像通过 yum 的方式安装的 nginx,需要注意其它 Linux 发行版中的 Nginx 配置方式是
有区别的,课程资料中提供了 nginx 镜像制作的 Dockerfile 可自行查阅。
[root@xuegod63 lnmp]# vim /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 {
 }
 } }

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

[root@xuegod63 lnmp]# kubectl get svc

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

[root@xuegod63 lnmp]# kubectl create configmap lnmp-nginx-config --from-file=/root/lnmp/conf/nginx.conf
[root@xuegod63 lnmp]# kubectl get configmap #查看新生成的 ConfigMap
NAME DATA AGE
lnmp-nginx-config 1 131d

创建 nginx-deployment

[root@xuegod63 lnmp]# vim 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: 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

部署 nginx

[root@xuegod63 lnmp]# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-shop created

创建 nginx-svc

[root@xuegod63 lnmp]# vim nginx-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
 name: nginx-shop
spec:
 type: NodePort
 ports:
 - name: nginx
 port: 80
 protocol: TCP
 targetPort: 80
 nodePort: 30010
 selector:
 app: nginx-shop
注:nginx-svc 增加了 nodePort 对外提供服务。
[root@xuegod63 lnmp]# kubectl apply -f nginx-svc.yaml

访问测试:http://192.168.1.64:30010/
Rancher_第44张图片
部署 mysql 服务

mysql 服务我们就不额外挂载数据卷和指定 node 运行了,生产环境中还是建议单独挂载数据卷使用。

[root@xuegod63 lnmp]# vim 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

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

[root@xuegod63 lnmp]# kubectl apply -f mysql-deployment.yaml
deployment.apps/mysql created

创建 mysql-svc

[root@xuegod63 lnmp]# vim 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@xuegod63 lnmp]# vim 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

5 实战-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 规则
Rancher_第45张图片
创建名称 xuegod→自定义域名→shop.com
Rancher_第46张图片
删除默认的配置项,默认的是工作负载,我们需要添加服务。
Rancher_第47张图片
添加服务(service):
Rancher_第48张图片
服务选择 nginx-shop 端口选择 nginx 即可,
注:端口名称 nginx 是 service ports name,调用时可以使用端口也可以直接使用名称。

Rancher_第49张图片
填好配置请勿点击添加规则,直接保存即可。
Rancher_第50张图片
稍等 2 分钟:
Rancher_第51张图片
添加本地 hosts 解析。
C:\Windows\System32\drivers\etc

在这里插入图片描述
添加行:
192.168.1.62 shop.com

浏览器访问:http://shop.com/
Rancher_第52张图片

Rancher_第53张图片
注:管理员 admin 的密码要大于或等于 8 位,且最少要包括字母和数字。我的密码:xuegod123
Rancher_第54张图片
Rancher_第55张图片
http://shop.com/
Rancher_第56张图片
http://shop.com/admin
Rancher_第57张图片
多个服务的发布:多个域名解析到边缘节点,ingress 创建域名对应的后端服务规则即可。反向代理会先匹配域名规则再将请求调度到后端,和基于域名的虚拟主机一样。

你可能感兴趣的:(Linux,kubernetes)