2小时躲坑k8s-大型分布式集群环境捷径部署
课程介绍
Kubernetes(k8s)一个用于容器集群的自动化部署、扩容以及运维的开源平台。通过Kubernetes,你可以快速有效地响应用户需求;快速而有预期地部署你的应用;极速地扩展你的应用;无缝对接新应用功能;节省资源,优化硬件资源的使用。为容器编排管理提供了完整的开源方案。
Kubernetes解决了什么问题?
- 服务器环境
- 服务器资源管理
- 服务容灾恢复
- 硬件资源利用
- 服务资源创建
- 可视化管理
- 服务资源监控
- 资源整合管理
Kubernetes在容器编排可谓是做到了淋漓尽致,解决了之前的种种痛点,但是学习成本也相对较高,需要结合一定的实践,踩一定的坑才能形成自己的理解。
目标
- 了解什么是k8s,为什么世界需要它,k8s的工程师又为什么这么抢手。
- k8s企业环境部署捷径,多Master/node躲坑快速部署。
- 基于Kubernetes集群管理,kubeadm,kubectl等常见指令使用。
- 基于Kubernetes快速启动集群Web应用。
一、Kubernetes概述
1、什么是k8s
Kubernetes(K8s)是Google在2014年发布的一个开源项目。
据说Google的数据中心里运行着20多亿个容器,而且Google十年多前就开始使用容器技术。
最初,Google开发了一个叫Borg的系统(现在命名为Omega)来调度如此庞大数量的容器和工作负载。在积累了这么多年的经验后,Google决定重写这个容器管理系统,并将其贡献到开源社区,让全世界都能受益。
这个项目就是Kubernetes。简单地讲,Kubernetes是Google Omega的开源版本。
从2014年第一个版本发布以来,Kubernetes迅速获得开源社区的追捧,包括Red Hat、VMware、Canonical在内的很多有影响力的公司加入到开发和推广的阵营。目前Kubernetes已经成为发展最快、市场占有率最高的容器编排引擎产品。


2、Kubernetes解决了什么问题
- 通过 Kubernetes,分布式系统工具将拥有网络效应。每当人们为 Kubernetes 制作出的新的工具,都会让所有其他工具更完善。因此,这进一步巩固了 Kubernetes 的标准地位。
- 云提供商并非可替换的商品。不同的云提供的服务会变得越来越独特和不同。如果可以访问不同的云提供商提供的不同服务,那么企业将因此受益。
- 当多节点应用与单节点应用一样可靠时,我们将看到定价模型的变化。
- 这就是为什么我会被 Kubernetes 洗脑的原因,它是跨越异构系统的一个标准层。
- 将来,我们会像讨论编译器和操作系统内核一样讨论 Kubernetes。 Kubernetes 将会是低层级的管路系统,而不在普通应用开发人员的视野之内。
Kubernetes 已成为部署分布式应用的标准方式。在不远的将来,任何新成立的互联网公司都将用到 Kubernetes,无论其是否意识到这点。许多旧应用也正在迁移到 Kubernetes。
2.1 起因:Docker

单一稳定的一体化模型

微型化的应用部署模型
(微服务、分布式、集群、高可用、负载均衡…)

2.2 容器编排?是需要标准的?
如此多的docker该如何管理(通信、负载均衡、资源共享管理、容灾、监控、健康检查….)?
- Mesos

- docker swarm

- kubernetes

自2016年中,k8s表现出明显优势。

3. kubernetes工程师价值

二、环境
2.1 部署软件环境版本
操作系统: Ubuntu 18.10(本教程采用server版本)
Docker: docker-ce 18.06
Kubernetes: k8s 1.13.1
2.2 Ubuntu搭建研发环境
我们直接下载Unbuntu18.10-server版本,server版本的好处是没有Desktop,可以节省资源。
wget http://mirrors.aliyun.com/ubuntu-releases/18.10/ubuntu-18.10-live-server-amd64.iso注:也可以从配套资料中获取
2.3 Ubuntu安装过程
2.3.1 创建虚拟机
在VMWare 中启动安装虚拟过程
-
创建新的虚拟机,选择推荐版本的iso文件

-
选择自定义安装
-
为此虚拟机选择操作系统
Linux Ubuntu 64位 -
指定引导固件
UEFI不要选择BIOS
-
命名为Master
-
自定设置 存储为UbuntuMaster 2CPU 2048MB 20GB硬盘


-
建议移除声卡和摄像头
2.3.2 图形界面安装方式
-
选择英文语言
-
英文键盘
-
设置国内镜像源头
http://mirrors.aliyun.com/ubuntu/注意末尾的斜线 -
设置您的用户名和密码,下文使用YOUR_USERNAME YOUR_PASSWORD
-
切勿选择
microk8s snapstable: v1.14.2空格选中

- Tab键切换到DONE回车,开始安装过程

-
安装结束后点击重启Reboot Now

修改root密码
- 安装过程中,输入用户名
YOUR_USERNAME密码:YOUR_PASSWORD - 重新启动后登录 用户名
YOUR_USERNAME密码:YOUR_PASSWORD - 确认登录成功后输入
sudo passwd输入上面的YOUR_PASSWORD,然后输入root用户的密码root
设置root用户的密码root,是为了教学过程中简单。但是在生产环境下禁止使用弱强度的密码。
- 执行
exit退出当前登录用户,然后使用root用户重新登录 - 输入
shutdown now停机
2.4 修改主机名
修改主机名称
- 使用root用户登录
- 打开配置文件
vim /etc/cloud/cloud.cfg - 修改配置
preserve_hostname: true

- 重启
$ shutdown -r now2.5 配置静态IP(永久有效)(NAT模式)
- 使用root用户登录Linux,如下以Node2为例
vim /etc/netplan/50-cloud-init.yaml- 参考如下截图修改配置文件
- UbuntuMaster
172.16.235.146 - UbuntuNode1
172.16.235.147 - UbuntuNode2
172.16.235.148
network: ethernets: ens33: addresses: [192.168.236.177/24] dhcp4: false gateway4: 192.168.236.2 nameservers: addresses: [192.168.236.2] optional: true version: 2或者动态获取

2.6 修改hosts
使用root用户登录
-
打开hosts文件
vim /etc/hosts -
输入如下内容
Terminal window 192.168.236.177 master这个ip是当前桥接或者NAT分配的IP地址
-
重启机器
shutdown -r now
ip应用启动:
$netplan apply
三、Docker-CE安装及配置
3.1 Docker简介
3. 1.1 docker介绍
-
docker是什么 ?
Docker 是一个开源的应用容器引擎,是直接运行在宿主操作系统之上的一个容器,使用沙箱机制完全虚拟出一个完整的操作,容器之间不会有任何接口,从而让容器与宿主机之间、容器与容器之间隔离的更加彻底。每个容器会有自己的权限管理,独立的网络与存储栈,及自己的资源管理能,使同一台宿主机上可以友好的共存多个容器。
-
docker与虚拟机对比
如果物理机是一幢住宅楼,虚拟机就是大楼中的一个个套间,而容器技术就是套间里的一个个隔断。
-
虚拟化技术不同
- VMware Workstation、VirtualBoX
硬件辅助虚拟化:(Hardware-assisted Virtualization)是指通过硬件辅助支持模拟运行环境,使客户机操作系统可以独立运行,实现完全虚拟化的功能。
- Docker
操作系统层虚拟化:(OS-level virtualization)这种技术将操作系统内核虚拟化,可以允许使用者空间软件实例被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。这个软件实例,也被称为是一个容器(containers)、虚拟引擎(Virtualization engine)、虚拟专用服务器(virtual private servers)。每个容器的进程是独立的,对于使用者来说,就像是在使用自己的专用服务器。
以上两种虚拟化技术都属于软件虚拟化,在现有的物理平台上实现对物理平台访问的截获和模拟。在软件虚拟化技术中,有些技术不需要硬件支持;而有些软件虚拟化技术,则依赖硬件支持。
-
应用场景不同
- 虚拟机更擅长于彻底隔离整个运行环境。如: 云服务提供商通常采用虚拟机技术隔离不同的用户。
- Docker通常用于隔离不同的应用,例如前端,后端以及数据库。
-
资源的使用率不同
虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。
-
-
docker的版本
- Docker-CE -> 社区版
- Stable 版
- 稳定版, 一个季度更新一次
- Edge 版
- 一个月更新一般
- Stable 版
- Docker-EE
- 企业版
- 收费的
- Docker-CE -> 社区版

3.2 配置国内源
3.2.1 基础准备
- Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。
uname -r4.18.0-21-generic(主版本必须保持一致)- 安装
curl
apt-get update && apt-get install -y curl telnet wget man \apt-transport-https \ca-certificates \software-properties-common vim-
查看新版本号
- Ubuntu 18.10
Terminal window $ lsb_release -cCodename: cosmic -
查看确认国内源
Terminal window $ cp /etc/apt/sources.list /etc/apt/sources.list.bak$ cat /etc/apt/sources.list
3.2.2 在线安装Docker-ce(本教程不推荐)
(建议下面的手动安装方式,因为在线可能会出现版本不一致)
注意: 该国内源目前提供 18.09版本,与k8s不符。k8s推荐安装Docker ce 18.06
-
安装GPG秘钥和添加国内镜像
Terminal window $ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -添加国内源头
Terminal window $ add-apt-repository \"deb https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \$(lsb_release -cs) \stable"

- 更新国内源路径
apt update3.安装查看版本指令
apt-get install -y apt-show-versions4.查看docker-ce版本号
apt-show-versions -a docker-ce- 在线安装
Docker-ce
sudo apt-get update && apt-get install -y docker-ce注意到当前安装的版本是 `docker-ce_5%3a18.09.6~3-0~ubuntu-cosmic_amd64.deb`3.2.3 手动安装Docker(离线安装)
- 下载
docker-ce_18.06.1\~ce\~3-0\~ubuntu_amd64.deb - 上传到上述文件到待安装服务器
master - 登录待安装服务器,切换到root账户
dpkg -i docker-ce_18.06.1\~ce\~3-0\~ubuntu_amd64.deb
如果提示错误
dpkg: error: dpkg frontend is locked by another process说明已经有其他进程在使用dpkg安装程序
sudo rm /var/lib/dpkg/lock即可。
如果提示错误
itcast@master:~/package$ sudo dpkg -i docker-ce_18.06.1~ce~3-0~ubuntu_amd64.deb
[sudo] password for itcast:Selecting previously unselected package docker-ce.(Reading database ... 100647 files and directories currently installed.)Preparing to unpack docker-ce_18.06.1~ce~3-0~ubuntu_amd64.deb ...Unpacking docker-ce (18.06.1~ce~3-0~ubuntu) ...dpkg: dependency problems prevent configuration of docker-ce: docker-ce depends on libltdl7 (>= 2.4.6); however: Package libltdl7 is not installed.
dpkg: error processing package docker-ce (--install): dependency problems - leaving unconfiguredProcessing triggers for man-db (2.8.4-2) ...Processing triggers for systemd (239-7ubuntu10) ...Errors were encountered while processing: docker-ce表示当前docker-ce 依赖系统libltd17库,安装就可以了
$ apt-get install -y libltdl7- docker version
Client: Version: 18.06.1-ce API version: 1.38 Go version: go1.10.3 Git commit: e68fc7a Built: Tue Aug 21 17:24:56 2018 OS/Arch: linux/amd64 Experimental: false
Server: Engine: Version: 18.06.1-ce API version: 1.38 (minimum version 1.12) Go version: go1.10.3 Git commit: e68fc7a Built: Tue Aug 21 17:23:21 2018 OS/Arch: linux/amd64 Experimental: false确保版本号是 18.06
3.3 启动Docker-ce
- 开机并启动docker
sudo systemctl enable dockersudo systemctl start docker- 重启,登录确认
docker已经运行
itcast@ubuntu:~$ sudo docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES- 下载
Alpine镜像热身一下Docker
~$ sudo docker run -it --rm alpine:latest sh输出内容如下,我们在Docker容器中测试三个命令,分别是
- `date`- `time`- `uname -r`itcast@ubuntu:~$ sudo docker run -it --rm alpine:latest shUnable to find image 'alpine:latest' locallylatest: Pulling from library/alpinee7c96db7181b: Pull completeDigest: sha256:769fddc7cc2f0a1c35abb2f91432e8beecf83916c421420e6a6da9f8975464b6Status: Downloaded newer image for alpine:latest/ # dateMon Jun 10 07:56:01 UTC 2019/ # timeBusyBox v1.29.3 (2019-01-24 07:45:07 UTC) multi-call binary.
Usage: time [-vpa] [-o FILE] PROG ARGS
Run PROG, display resource usage when it exits
-v Verbose -p POSIX output format -f FMT Custom format -o FILE Write result to FILE -a Append (else overwrite)/ # uname -r4.18.0-10-generic
3.4 创建Docker用户组并添加当前用户
使用您的用户登录Linux然后执行如下操作,用户组docker可能已经存在。
如果使用普通用户目前是无法使用docker指令的
itcast@master:~$ docker psGot permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/json: dial unix /var/run/docker.sock: connect: permission denied我们需要将当前的普通用户添加到当前的docker用户组中
sudo groupadd dockersudo usermod -aG docker $USERexit重新登录使用普通用户登录:
itcast@master:~$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES就可以使用了。
3.5 申请阿里云镜像加速器
如果不申请阿里云私人专属镜像加速器,鼓励复制如下本人申请的私人专属镜像加速器,直接使用即可。
https://ozcouv1b.mirror.aliyuncs.com申请步骤如下
在阿里云注册自己账户
找到容器镜像服务,参考网址如下
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors点开左侧菜单镜像中心—>镜像加速器
右侧加速器地址,即使私人专属的镜像加速器地址,点击复制
粘贴到一个文本文件留存
3.6 docker配置国内镜像加速器
目的 : 为了下载docker镜像更快
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器。
创建/etc/docker/daemon.json文件,内容如下:
{ "registry-mirrors": ["https://ozcouv1b.mirror.aliyuncs.com"]}重启docker服务
# 重载所有修改过的配置文件sudo systemctl daemon-reload# 重启Docker服务sudo systemctl restart docker四、Kubernetes 安装及部署
4.1 k8s安装环境准备
4.1.1 配置并安装k8s国内源
-
创建配置文件
sudo touch /etc/apt/sources.list.d/kubernetes.list -
添加写权限
Terminal window itcast@master:~$ sudo chmod 666 /etc/apt/sources.list.d/kubernetes.list再添加,内容如下:
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main -
执行
sudo apt update更新操作系统源,开始会遇见如下错误Terminal window tcast@master:~$ sudo apt updateGet:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease [8,993 B]Err:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InReleaseThe following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FBHit:2 http://mirrors.aliyun.com/ubuntu cosmic InReleaseHit:3 http://mirrors.aliyun.com/ubuntu cosmic-updates InReleaseHit:4 http://mirrors.aliyun.com/ubuntu cosmic-backports InReleaseHit:5 http://mirrors.aliyun.com/ubuntu cosmic-security InReleaseErr:6 https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu cosmic InReleaseCould not wait for server fd - select (11: Resource temporarily unavailable) [IP: 202.141.176.110 443]Reading package lists... DoneW: GPG error: http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FBE: The repository 'http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease' is not signed.N: Updating from such a repository can't be done securely, and is therefore disabled by default.N: See apt-secure(8) manpage for repository creation and user configuration details.其中:
Terminal window The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB签名认证失败,需要重新生成。记住上面的NO_PUBKEY
6A030B21BA07F4FB -
添加认证key
运行如下命令,添加错误中对应的key(错误中NO_PUBKEY后面的key的后8位)
Terminal window gpg --keyserver keyserver.ubuntu.com --recv-keys BA07F4FB接着运行如下命令,确认看到OK,说明成功,之后进行安装:
Terminal window gpg --export --armor BA07F4FB | sudo apt-key add - -
再次重新
sudo apt update更新系统下载源数据列表
itcast@master:~$ sudo apt updateHit:1 https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu cosmic InReleaseHit:2 http://mirrors.aliyun.com/ubuntu cosmic InReleaseHit:3 http://mirrors.aliyun.com/ubuntu cosmic-updates InReleaseHit:4 http://mirrors.aliyun.com/ubuntu cosmic-backports InReleaseHit:5 http://mirrors.aliyun.com/ubuntu cosmic-security InReleaseGet:6 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease [8,993 B]Ign:7 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial/main amd64 PackagesGet:7 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial/main amd64 Packages [26.6 kB]Fetched 26.6 kB in 42s (635 B/s)Reading package lists... DoneBuilding dependency treeReading state information... Done165 packages can be upgraded. Run 'apt list --upgradable' to see them.以上没有报和错误异常,表示成功。
4.1.2 禁止基础设施
-
禁止防火墙
Terminal window $ sudo ufw disableFirewall stopped and disabled on system startup -
关闭swap
Terminal window # 成功$ sudo swapoff -a# 永久关闭swap分区$ sudo sed -i 's/.*swap.*/#&/' /etc/fstab -
禁止selinux
# 安装操控selinux的命令$ sudo apt install -y selinux-utils# 禁止selinux$ setenforce 0# 重启操作系统$ shutdown -r now# 查看selinux是否已经关闭$ sudo getenforceDisabled(表示已经关闭)4.2 k8s系统网络配置
(1) 配置内核参数,将桥接的IPv4流量传递到iptables的链
创建/etc/sysctl.d/k8s.conf文件
添加内容如下:
net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1vm.swappiness = 0(2) 执行命令使修改生效
# 【候选】建议执行下面的命令$ sudo modprobe br_netfilter$ sudo sysctl -p /etc/sysctl.d/k8s.conf4.3 安装k8s
注意: 切换到root用户
$ su
-
安装Kubernetes 目前安装版本
v1.13.1Terminal window $ apt update && apt-get install -y kubelet=1.13.1-00 kubernetes-cni=0.6.0-00 kubeadm=1.13.1-00 kubectl=1.13.1-00 -
设置为开机重启
Terminal window $ sudo systemctl enable kubelet && systemctl start kubelet$ sudo shutdown -r now
4.4 验证k8s
-
使用root用户登录
Master主机 -
执行如下个命令
Terminal window kubectl get nodes
输出如下
$ kubectl get nodesThe connection to the server localhost:8080 was refused - did you specify the right host or port?-
查看当前k8s版本
Terminal window $ kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.1", GitCommit:"eec55b9ba98609a46fee712359c7b5b365bdd920", GitTreeState:"clean", BuildDate:"2018-12-13T10:39:04Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}The connection to the server localhost:8080 was refused - did you specify the right host or port?五、创建企业Kubernetes多主机集群环境
5.1 创建两个节点(两个虚拟机)
- 在VMWare中创建完整克隆,分别命名为
UbuntuNode1和UbuntuNode2
分别对两个完整克隆的虚拟机进行如下操作,修改主机名称和静态IP
-
使用root用户登录
-
打开配置文件
vim /etc/cloud/cloud.cfg -
修改配置
preserve_hostname: true -
修改
/etc/hostname,只有一行node1或node2
5.2 master和node基础配置
5.2.1 给node配置hostname
node1主机
/etc/hostname
node1node2主机
/et/hostname
node22.确认配置的三台机器的主机名称
$ cat /etc/hosts$ shutdown -r now5.2.2 配置IP地址
- master
/etc/netplan/50-cloud-init.yaml
network: ethernets: ens33: addresses: [192.168.236.177/24] dhcp4: false gateway4: 192.168.236.2 nameservers: addresses: [192.168.236.2] optional: true version: 2重启ip配置
netplan apply- node1
/etc/netplan/50-cloud-init.yaml
network: ethernets: ens33: addresses: [192.168.236.178/24] dhcp4: false gateway4: 192.168.236.2 nameservers: addresses: [192.168.236.2] optional: true version: 2重启ip配置
netplan apply- node2
/etc/netplan/50-cloud-init.yaml
network: ethernets: ens33: addresses: [192.168.236.179/24] dhcp4: false gateway4: 192.168.236.2 nameservers: addresses: [192.168.236.2] optional: true version: 2重启ip配置
netplan apply5.2.3 修改hosts文件
注意: (Master、Node1、Node2都需要配置)
使用root用户登录
-
打开hosts文件
vim /etc/hosts -
输入如下内容
Terminal window 192.168.236.177 master192.168.236.178 node1192.168.236.179 node2 -
重启机器
shutdown -r now
5.3 配置Master节点
5.3.1 创建工作目录
$ mkdir /home/itcast/working$ cd /home/itcast/working/5.3.2 创建kubeadm.conf配置文件
- 创建k8s的管理工具
kubeadm对应的配置文件,候选操作在home/itcast/working/目录下
使用kubeadm配置文件,通过在配置文件中指定docker仓库地址,便于内网快速部署。
生成配置文件
kubeadm config print init-defaults ClusterConfiguration > kubeadm.conf- 修改
kubeadm.conf中的如下两项:
- imageRepository
- kubernetesVersion
vi kubeadm.conf# 修改 imageRepository: k8s.gcr.io# 改为 registry.cn-beijing.aliyuncs.com/imctoimageRepository: registry.cn-beijing.aliyuncs.com/imcto# 修改kubernetes版本kubernetesVersion: v1.13.0# 改为kubernetesVersion: v1.13.1kubernetesVersion: v1.13.1- 修改
kubeadm.conf中的API服务器地址,后面会频繁使用这个地址。
- localAPIEndpoint:
localAPIEndpoint: advertiseAddress: 192.168.236.177 bindPort: 6443注意:
192.168.236.177是master主机的ip地址
- 配置子网网络
networking: dnsDomain: cluster.local podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12scheduler: {}这里的10.244.0.0/16 和 10.96.0.0/12分别是k8s内部pods和services的子网网络,最好使用这个地址,后续flannel网络需要用到。
5.3.3 拉取K8s必备的模块镜像
- 查看一下都需要哪些镜像文件需要拉取
$ kubeadm config images list --config kubeadm.confregistry.cn-beijing.aliyuncs.com/imcto/kube-apiserver:v1.13.1registry.cn-beijing.aliyuncs.com/imcto/kube-controller-manager:v1.13.1registry.cn-beijing.aliyuncs.com/imcto/kube-scheduler:v1.13.1registry.cn-beijing.aliyuncs.com/imcto/kube-proxy:v1.13.1registry.cn-beijing.aliyuncs.com/imcto/pause:3.1registry.cn-beijing.aliyuncs.com/imcto/etcd:3.2.24registry.cn-beijing.aliyuncs.com/imcto/coredns:1.2.6- 拉取镜像
#下载全部当前版本的k8s所关联的镜像kubeadm config images pull --config ./kubeadm.conf5.3.4 初始化kubernetes环境
#初始化并且启动$ sudo kubeadm init --config ./kubeadm.conf更多kubeadm配置文件参数详见
kubeadm config print-defaultsk8s启动成功输出内容较多,但是记住末尾的内容
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each nodeas root:
kubeadm join 192.168.236.177:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:e778d3665e52f5a680a87b00c6d54df726c2eda601c0db3bfa4bb198af2262a8按照官方提示,执行以下操作。
-
执行如下命令
Terminal window $ mkdir -p $HOME/.kube$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/config -
创建系统服务并启动
Terminal window # 启动kubelet 设置为开机自启动$ sudo systemctl enable kubelet# 启动k8s服务程序$ sudo systemctl start kubelet
5.3.5 验证kubernetes启动结果
- 验证输入,注意显示master状态是
NotReady,证明初始化服务器成功
$ kubectl get nodesNAME STATUS ROLES AGE VERSIONmaster NotReady master 12m v1.13.1- 查看当前k8s集群状态
$ kubectl get csNAME STATUS MESSAGE ERRORscheduler Healthy okcontroller-manager Healthy oketcd-0 Healthy {"health": "true"}目前只有一个master,还没有node,而且是NotReady状态,那么我们需要将node加入到master管理的集群中来。在加入之前,我们需要先配置k8s集群的内部通信网络,这里采用的是flannel网络。
5.3.6 部署集群内部通信flannel网络
$cd $HOME/working$wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml编辑这个文件,确保flannel网络是对的,找到 net-conf.json标记的内容是否正确。
net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" }这个”10.244.0.0/16”和 ./kubeadm.conf中的podsubnet的地址要一致。
应用当前flannel配置文件
itcast@master:~/working$ kubectl apply -f kube-flannel.yml输出结果如下
root@master:~/working# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.ymlclusterrole.rbac.authorization.k8s.io/flannel createdclusterrolebinding.rbac.authorization.k8s.io/flannel createdserviceaccount/flannel createdconfigmap/kube-flannel-cfg createddaemonset.extensions/kube-flannel-ds-amd64 createddaemonset.extensions/kube-flannel-ds-arm64 createddaemonset.extensions/kube-flannel-ds-arm createddaemonset.extensions/kube-flannel-ds-ppc64le createddaemonset.extensions/kube-flannel-ds-s390x created安装flannel网络前 执行kubectl get nodes输出结果如下
itcast@master:~/working$ kubectl get nodeNAME STATUS ROLES AGE VERSIONmaster NotReady master 10m v1.13.1安装flannel网络后 执行kubectl get nodes输出结果如下
itcast@master:~/working$ kubectl get nodeNAME STATUS ROLES AGE VERSIONmaster Ready master 10m v1.13.1此时master已经是Ready状态了,表示已经配置成功了,那么我们就需要配置node来加入这个集群。
5.4 配置Node
5.4.1 确认外部环境
-
确认关闭swap
Terminal window apt install -y selinux-utilsswapoff -a -
禁止selinux
Terminal window setenforce 0 -
确认关闭防火墙
Terminal window ufw disable
5.4.2 配置k8s集群的Node主机环境
-
启动k8s后台服务
Terminal window # 启动kubelet 设置为开机自启动$ sudo systemctl enable kubelet# 启动k8s服务程序$ sudo systemctl start kubelet -
将master机器的
/etc/kubernetes/admin.conf传到到node1和node2登录
master终端Terminal window #将admin.conf传递给node1sudo scp /etc/kubernetes/admin.conf itcast@192.168.236.178:/home/itcast/#将admin.conf传递给node2sudo scp /etc/kubernetes/admin.conf itcast@192.168.236.179:/home/itcast/ -
登录
node1终端,创建基础kube配置文件环境
$ mkdir -p $HOME/.kube$ sudo cp -i $HOME/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/config- 登录
node2终端,创建基础kube配置文件环境
$ mkdir -p $HOME/.kube$ sudo cp -i $HOME/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/confignode1和node2分别连接master加入master集群。这里用的是kubeadm join指令
$ sudo kubeadm join 192.168.236.177:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:e778d3665e52f5a680a87b00c6d54df726c2eda601c0db3bfa4bb198af2262a8这里要注意,使用的hash应该是master主机 kubeadm init成功之后生成的hash码。
- 应用两个node主机分别应用flannel网络
将master中的kube-flannel.yml分别传递给两个node节点.
#将kube-flannel.yml传递给node1sudo scp $HOME/working/kube-flannel.yml itcast@192.168.236.178:/home/itcast/#将kube-flannel.yml传递给node2sudo scp $HOME/working/kube-flannel.yml itcast@192.168.236.179:/home/itcast/分别启动flannel网络
itcast@node1:~$ kubectl apply -f kube-flannel.ymlitcast@node2:~$ kubectl apply -f kube-flannel.yml- 查看node是否已经加入到k8s集群中(需要等一段时间才能ready)
itcast@node2:~$ kubectl get nodesNAME STATUS ROLES AGE VERSIONmaster Ready master 35m v1.13.1node1 Ready <none> 2m23s v1.13.1node2 Ready <none> 40s v1.13.1六、应用实例
6.1 创建MySQL实例
6.1.1 定义描述文件
apiVersion: v1kind: ReplicationController #副本控制器RCmetadata: name: mysql #RC的名称,全局唯一spec: replicas: 1 #Pod副本的期待数量 selector: app: mysql #符合目标的Pod拥有此标签 template: #根据此模板创建Pod的副本(实例) metadata: labels: app: mysql #Pod副本拥有的标签,对应RC的Selector spec: containers: #Pod内容器的定义部分 - name: mysql #容器的名称 image: hub.c.163.com/library/mysql #容器对应的Docker image ports: - containerPort: 3306 #容器应用监听的端口号 targetPort: 3306 env: #注入容器内的环境变量 - name: MYSQL_ROOT_PASSWORD value: "123456"6.1.2 加载ReplicationController副本控制器描述文件
创建好mysql-rc.yaml后,在master节点使用kubectl命令将它发布到k8s集群中。
kubectl create -f mysql-rc.yaml6.1.3 查看启动状态
通过查看当前的pods列表,是否已经启动成功:
6.1.4 网络异常解决方案(未出现问题可直接跳过)
注意:如果这里出现了ContainerCreating状态,那么可以尝试如下解决办法:
itcast@master:~/working$ kubectl get podsNAME READY STATUS RESTARTS AGEmysql-tscrh 0/1 ContainerCreating 0 17m目前mysql-tscrh 描述文件 已经创建,但是没有启动成功. 状态是ContainerCreating 没有启动起来.
通过kubectl describe pods 来查看pods的详细状态
itcast@master:~/working$ kubectl describe pods mysqlName: mysql-tscrhNamespace: defaultPriority: 0PriorityClassName: <none>Node: node1/192.168.236.178Start Time: Mon, 17 Jun 2019 09:10:35 +0000Labels: app=mysqlAnnotations: <none>Status: PendingIP:Controlled By: ReplicationController/mysqlContainers: mysql: Container ID: Image: hub.c.163.com/library/mysql Image ID: Port: 3306/TCP Host Port: 0/TCP State: Waiting Reason: ContainerCreating Ready: False Restart Count: 0 Environment: MYSQL_ROOT_PASSWORD: 123456 Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-q6ggq (ro)Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled TrueVolumes: default-token-q6ggq: Type: Secret (a volume populated by a Secret) SecretName: default-token-q6ggq Optional: falseQoS Class: BestEffortNode-Selectors: <none>Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300sEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 22m default-scheduler Successfully assigned default/mysql-tscrh to node1 Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "58d143373e767c40610587624c667d8e20dd77fa397952406a085f2ae1dc38e6" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "81d12726dbe075c64af48142638e98863231e8201ccc292f0dda1fccfa7fdaec" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "8bd77ee0176d369435ead7bd3c2675b7bbcbdc2b052cf34c784f04053a7d5288" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "0733fc209e085e96f5823a2280b012a609dace41fda967c5ae951005a8699ce6" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "91f337eb334612b2e7426d820ba4b15a9c9c549050517d459508832b69780b5f" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "48cbba9896068a774d9128a6864394e8726a0d857bae61036421ad73f5d6e3dd" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "d259778aa19418a9a429b3175b66afae3d8ffb7324ec9df492b2947dbc153460" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "3d01c00ac9eaac7b2e983402be38c1cf60c4bbd1d454aa45329ce0ca0c2bf792" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "98879cbb0405dac3a24753dd1986070a53fe9ee9f1b819996a903c19286a2bb7" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory Warning FailedCreatePodSandBox 7m49s (x838 over 22m) kubelet, node1 (combined from similar events): Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "60923335b41c2d0412b279bdb6150f9b9b7eae20c4a02549e35509083c01384b" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory Normal SandboxChanged 2m49s (x1127 over 22m) kubelet, node1 Pod sandbox changed, it will be killed and re-created.会看到一个错误:
"mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory这是缺少/run/flannel/subnet.env文件
解决办法:配置flannel网络
分别在三台服务器上执行如下步骤
-
创建目录
Terminal window sudo mkdir -p /run/flannel -
创建环境描述文件
Terminal window $ sudo tee /run/flannel/subnet.env <<-'EOF'FLANNEL_NETWORK=10.244.0.0/16FLANNEL_SUBNET=10.244.0.1/24FLANNEL_MTU=1450FLANNEL_IPMASQ=trueEOF
6.1.5 查看mysql实例集群状态
itcast@master:~/working$ kubectl get podsNAME READY STATUS RESTARTS AGEmysql-tscrh 0/1 Running 0 17m如果为Running状态,则为mysql集群启动成功。
6.2 创建Tomcat实例
6.2.1 定义描述文件
apiVersion: v1kind: ReplicationControllermetadata: name: mywebspec: replicas: 5 #Pod副本期待数量为5 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: docker.io/kubeguide/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: "mysql" - name: MYSQL_SERVICE_PORT value: "3306"6.2.2 加载RC副本描述文件
$ kubectl create -f myweb-rc.yamlreplicationcontroller/myweb created$ kubectl get rcNAME DESIRED CURRENT READY AGEmysql 1 1 0 4m22smyweb 5 5 0 7s$ kubectl get podsNAME READY STATUS RESTARTS AGEmysql-tp69s 1/1 Running 0 21smyweb-266mz 0/1 ContainerCreating 0 2smyweb-j7nl7 0/1 ContainerCreating 0 2smyweb-s7drm 0/1 ContainerCreating 0 2smyweb-sq4ns 0/1 ContainerCreating 0 2smyweb-t4vlf 0/1 ContainerCreating 0 2s$注意mysql实例 状态 Running
myweb实例状态 ContainerCreating
过几分钟myweb实例状态变成 Running
6.2.3 创建服务副本
在master服务器
- 使用root用户登录,并切换到working目录
cd /root/working - 创建描述服务描述文件
myweb-svc.yaml
apiVersion: v1kind: Servicemetadata: name: mywebspec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb6.2.4 部署服务
$kubectl create -f myweb-svc.yaml6.2.5 验证
$ kubectl get podsNAME READY STATUS RESTARTS AGEmysql-tp69s 1/1 Running 0 15mmyweb-266mz 1/1 Running 0 14mmyweb-j7nl7 1/1 Running 0 14mmyweb-s7drm 1/1 Running 0 14mmyweb-sq4ns 1/1 Running 0 14mmyweb-t4vlf 1/1 Running 0 14mitcast@master:~/working$ kubectl get serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19hmyweb NodePort 10.109.234.197 <none> 8080:30001/TCP 25m已经看到已经有一个myweb服务已经启动
itcast@master:~/working$ kubectl describe service mywebName: mywebNamespace: defaultLabels: <none>Annotations: <none>Selector: app=mywebType: NodePortIP: 10.109.234.197Port: <unset> 8080/TCPTargetPort: 8080/TCPNodePort: <unset> 30001/TCPEndpoints: 10.244.0.6:8080,10.244.0.6:8080,10.244.0.7:8080 + 2 more...Session Affinity: NoneExternal Traffic Policy: ClusterEvents: <none>service详情这里的IP就是CLUSTER-IP. CLUSTER-IP是和service绑定的。
service详情这里的Port就是Service的端口号。
service详情这里的NodePort就是Node的真实端口号。
service详情这里的Endpoints就是容器的IP和port。
验证端口号
$ netstat -tlp|grep 30001tcp6 0 0 [::]:30001 [::]:* LISTEN 4333/kube-proxy$我们可以打开浏览器,输入master/node1/node2任何一个地址家30001端口都可以,访问tomcat服务。
http://192.168.236.177:300016.3 创建自定义的Beego 应用web程序集群
6.3.1 初始化mysql
- 找到我们之前创建好的mysql的pod的
NAME
itcast@master:~$ kubectl get podsNAME READY STATUS RESTARTS AGEmysql-kjdz8 1/1 Running 2 4d23hmyweb-f7rt4 1/1 Running 2 4d23hmyweb-jjxbp 1/1 Running 2 4d23hmyweb-k8rmt 1/1 Running 2 4d23hmyweb-rht8n 1/1 Running 2 4d23hmyweb-wsgzw 1/1 Running 2 4d23h- 查看当前pod的详细信息
itcast@master:~$ kubectl describe pod mysql-kjdz8- 得到mysql在subnet内网的IP地址
10.244.1.8和登录密码
IP: 10.244.1.8 ... Environment: MYSQL_ROOT_PASSWORD: 123456- 登录mysql实例,创建数据库
itcast@master:~$ kubectl exec -it mysql-kjdz8 -- bashroot@mysql-kjdz8:/# mysql -u root --password=123456 --default-character-set=utf8- 创建数据库,注意大小写
CREATE DATABASE IF NOT EXISTS newsWeb default charset utf8 COLLATE utf8_general_ci;- 使用数据库
use newsWeb6.3.2 下载自定义的beego-docker 镜像
itcast@master:~$ docker pull registry.cn-shanghai.aliyuncs.com/itcast-golang/beego-microservices:v4921b31ab772b: Pull complete5dbef71438d6: Pull complete06b82a06d476: Pull complete903fde8a2004: Pull complete5102aca51d1d: Pull completeb0ebda6ce096: Pull complete1a243f1cae73: Pull completeDigest: sha256:7b83e5117d964f348750de76104d6302285410365aaf6e6a0d4f57edab7a0ad5Status: Downloaded newer image for registry.cn-shanghai.aliyuncs.com/itcast-golang/beego-microservices:v4当然,目前该镜像地址是我们自己打包的,如果你想启动你自己的镜像应用,也需要打包成docker镜像放在阿里云或者其他docker仓库中。
查看docker镜像是否已经下载成功。
itcast@master:~$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEregistry.cn-shanghai.aliyuncs.com/itcast-golang/beego-microservices v4 11f6f974f78b 35 minutes ago 23.1MBalpine latest 055936d39205 6 weeks ago 5.53MBregistry.cn-beijing.aliyuncs.com/imcto/kube-controller-manager v1.13.1 6ca952430d0a 3 months ago 146MBregistry.cn-beijing.aliyuncs.com/imcto/kube-proxy v1.13.1 a311f9763fcc 3 months ago 80.2MBregistry.cn-beijing.aliyuncs.com/imcto/coredns 1.2.6 782ac1267b76 3 months ago 40MBregistry.cn-beijing.aliyuncs.com/imcto/etcd 3.2.24 399cf402bfe9 3 months ago 220MBregistry.cn-beijing.aliyuncs.com/imcto/pause 3.1 73ae15a7a613 3 months ago 742kBregistry.cn-beijing.aliyuncs.com/imcto/kube-scheduler v1.13.1 4b8df70aff4e 3 months ago 79.6MBregistry.cn-beijing.aliyuncs.com/imcto/kube-apiserver v1.13.1 06924f18fe15 3 months ago 181MBquay.io/coreos/flannel v0.11.0-amd64 ff281650a721 4 months ago 52.6MB6.3.3 创建beego的RC副本文件
apiVersion: v1kind: ReplicationControllermetadata: name: beegospec: replicas: 5 #Pod副本期待数量为5 selector: app: beego template: metadata: labels: app: beego spec: containers: - name: beego image: registry.cn-shanghai.aliyuncs.com/itcast-golang/beego-microservices:v4 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: "10.244.1.8" - name: MYSQL_SERVICE_PORT value: "3306" - name: MYSQL_SERVICE_USER value: "root" - name: MYSQL_SERVICE_PASSWORD value: "123456" - name: MYSQL_SERVICE_DATABASE value: "newsWeb"---apiVersion: v1kind: Servicemetadata: name: beegospec: type: NodePort ports: - port: 8080 nodePort: 30080 selector: app: beego~这里要注意,里面的mysql环境变量IP、端口、数据库用户名密码等,都是我们上面实例获取到的。
这里实际上是在我们创建一个pods容器的时候,指定的一些环境变量。然后beego的应用程序会从系统中这些环境变量去取数据。
目前建立了NodePort端口映射,beegoWeb应用在内网的端口是8080,对外的映射端口是30080.那么30080就是我们外网可以访问的端口号。
6.3.4 装载RC副本文件,创建beego集群实例
$ kubectl apply -f golang-beego.yaml查看beego的web程序pods是否已经正常启动
itcast@master:~/working$ kubectl get podsNAME READY STATUS RESTARTS AGEbeego-2wt7s 1/1 Running 0 2m47sbeego-6jp8x 1/1 Running 0 2m47sbeego-7bkvl 1/1 Running 0 2m47sbeego-qjldn 1/1 Running 0 2m47sbeego-vldmh 1/1 Running 0 2m47smysql-kjdz8 1/1 Running 2 5dmyweb-f7rt4 1/1 Running 2 5dmyweb-jjxbp 1/1 Running 2 5dmyweb-k8rmt 1/1 Running 2 5dmyweb-rht8n 1/1 Running 2 5dmyweb-wsgzw 1/1 Running 2 5d也可以查看beego程序的pods的正常输出日志
itcast@master:~/working$ kubectl log beego-2wt7slog is DEPRECATED and will be removed in a future version. Use logs instead.2019/06/24 09:19:12 root:123456@tcp(10.244.1.8:3306)/newsWeb?charset=utf8table `user` already exists, skiptable `article` already exists, skiptable `article_type` already exists, skiptable `article_users` already exists, skip2019/06/24 09:19:12.241 [I] [asm_amd64.s:1337] http server Running on http://:8080进入其中一个beego容器,查看环境变量是否和我们配置的一致
itcast@master:~/working$ kubectl exec -it beego-2wt7s -- sh/app # envKUBERNETES_SERVICE_PORT=443KUBERNETES_PORT=tcp://10.96.0.1:443BEEGO_PORT_8080_TCP=tcp://10.107.31.251:8080HOSTNAME=beego-2wt7sMYWEB_SERVICE_HOST=10.106.98.4MYWEB_PORT_8080_TCP_ADDR=10.106.98.4SHLVL=1HOME=/rootMYWEB_PORT_8080_TCP_PORT=8080MYWEB_PORT_8080_TCP_PROTO=tcpMYWEB_SERVICE_PORT=8080MYWEB_PORT=tcp://10.106.98.4:8080MYWEB_PORT_8080_TCP=tcp://10.106.98.4:8080TERM=xtermKUBERNETES_PORT_443_TCP_ADDR=10.96.0.1MYSQL_SERVICE_PASSWORD=123456PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binKUBERNETES_PORT_443_TCP_PORT=443MYSQL_SERVICE_HOST=10.244.1.8KUBERNETES_PORT_443_TCP_PROTO=tcpMYSQL_SERVICE_USER=rootBEEGO_SERVICE_HOST=10.107.31.251BEEGO_PORT_8080_TCP_ADDR=10.107.31.251MYSQL_SERVICE_PORT=3306KUBERNETES_SERVICE_PORT_HTTPS=443KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443BEEGO_PORT_8080_TCP_PORT=8080KUBERNETES_SERVICE_HOST=10.96.0.1BEEGO_PORT_8080_TCP_PROTO=tcpPWD=/appMYSQL_SERVICE_DATABASE=newsWebBEEGO_PORT=tcp://10.107.31.251:8080BEEGO_SERVICE_PORT=8080/app # env | grep MYSQLMYSQL_SERVICE_PASSWORD=123456MYSQL_SERVICE_HOST=10.244.1.8MYSQL_SERVICE_USER=rootMYSQL_SERVICE_PORT=3306MYSQL_SERVICE_DATABASE=newsWeb6.3.5 验证集群是否成功
- 注册界面
http://192.168.236.177:30080/register

- 登陆界面
http://192.168.236.177:30080/login

- 后端界面

七、k8s架构图
