Kubernetes 简介及规划部署
- 云原生生态系统:http://dockone.io/article/3006
- CNCF 最新景观图:https://landscape.cncf.io/
- CNCF 云原生主要框架简介:https://www.kubernetes.org.cn/5482.html
- Kubernetes 设计架构:https://www.kubernetes.org.cn/kubernetes%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84
- Kubernetes 核心优势:
- 基于 yaml 文件实现容器的自动创建、删除
- 更快速实现业务的弹性横向扩展
- 动态发现新扩容的容器并自动对用户提供访问
- 更简单、更快捷的实现业务代码升级和回滚
Kubernetes 组件介绍
-
kube-apiserver:Kubernetes API 服务器为 api 对象验证并配置数据,包括 pod,服务(Services),复制控制器(Replication controller)和其他 api 对象。API 服务器提供 REST 限制操作和到集群共享状态的前端,所有其他组件通过它进行交互。
-
kube-scheduler:Kubernetes scheduler 是一个拥有丰富策略、能够感知拓扑变化、支持特定负载的功能组件,它对集群的可用性、性能表现以及容量都影响巨大。scheduler 需要考虑独立的和集体的资源需求、服务质量需求、硬件/软件/策略限制、亲和与反亲和规范、数据位置、内部负载接口、截止时间等等。如有必要,特定的负载需求可以通过 API 暴露出来。
-
https://k8smeetup.github.io/docs/admin/kube-controller-manager/
-
kube-controller-manager:Kubernetes 控制器管理器是一个守护程序,它嵌入了 Kubernetes 随附的核心控制循环。在机器人技术和自动化应用中,控制回路是一个非终止回路,用于调节系统状态。在 Kubernetes 中,控制器是一个控制回路,它通过 apiserver 监视集群的共享状态并进行更改以尝试将当前状态移向所需状态。今天,Kubernetes 附带的控制器示例包括复制控制器,端点控制器,名称空间控制器和 serviceaccounts 服务占比控制器。
-
Controller Manager 作为集群内部的管理控制中心,负责集群内的 Node、Pod 副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota) 的管理,当某个 Node 意外宕机时,Controller Manager 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
-
kube-proxy:Kubernetes 网络代理运行在 nodes 上。它反映了 node 上 Kubernetes API 中定义的服务,并可以通过一组后端进行简单的 TCP、UDP 流转发或循环模式 (round robin) 的 TCP、UDP 转发。目前,服务的集群 IP 和端口是通过 Docker-links 兼容的环境变量发现的,这些环境变量指定了服务代码打开的端口。有一个可选的 addon 为这些集群 IP 提供集群 DNS。用户必须使用 apiserver API 创建一个服务来配置代理。其实,就是 kube-proxy 通过在主机上维护网络规则并执行连接转发来实现 Kubernetes 服务访问。
-
kubelet:kubelet 是通过描述一个 pod 的 YAML 或 JSON 对象,kubelet 通过各种机制(主要通过apiserver)获取一个 PodSpec。并保证在这些 PodSpec 中描述的容器健康运行,kubelet 不管理不是由 Kubernetes 创建的容器。
-
除了来自 apiserver 的 Podespec,还有 3 种方式可以将容器清单提供给 kubelet。
- 文件:在命令行指定的一个路径,在这个路径下的文件将被重定向到监视更新,可选监视周期为 20 秒并可以通过参数配置。
- HTTP端点:在命令行指定的一个 HTTP 端点,该端点每 20 秒被检查一次并且可以通过参数配置检查周期。
- HTTP服务:kubelet 还可以监听 HTTP 服务并响应一个简单的 API 来创建一个新的清单。
-
kubelet 是主要的节点代理,它会监视已分配给节点的 pod,具体功能如下:
- 向 master 汇报 node 节点的状态信息
- 接受指令并在 pod 中创建 docker 容器
- 准备 pod 所需的数据卷
- 返回 pod 的运行状态
- 在 node 节点执行容器健康检查
-
etcd:etcd 是 CorOS 公司开发目前是 Kubernetes 默认使用的 key-value 数据存储系统,用于保存所有集群数据,支持分布式集群功能,生产环境使用时需要为 etcd 数据提供定期备份机制。
-
新版本组件介绍:https://kubernetes.io/zh/docs/concepts/overview/components/
部署规划图
- Kubernetes 中文文档:https://www.kubernetes.org.cn/k8s
安装方式
部署工具
- 使用批量部署工具如(ansible/saltstack)、手动二进制、kubeadm、apt-get/yum 等方式安装,一守护进程的方式启动在宿主机上,类似于时 Nginx 一样使用 service 脚本启动。
Kubeadm 工具
-
kubeadm 创建单主集群:https://kubernetes.io/zh/docs/setup/independent/create-cluster-kubeadm/
- 使用 kubernetes 官方提供的部署工具 kubeadm 自动安装,需要在 master 和 node 节点上安装 docker 等组件,然后初始化,把管理端的控制服务和 node 上的服务都以 pod 的方式运行。
-
kubeadm 工具概述:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/
-
v1.10 版本 kubeadm 介绍:https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md
安装注意事项
注意:禁用 swap、selinux、iptables
Kubernetes 部署过程
-
具体步骤
- 当前部署版本为当前次新版本,因为后面需要使用 kubeadm 做 kubernetes 版本升级演示。
- 目前官方最新版本为 v1.19.0,因此本次先以 v1.17.4 版本 kubernetes 为例。
- 安装思路
- 主机基础环境准备
- 部署 harbor 及 haproxy 高可用反向代理
- 在所有 kubernetes master 安装指定版本的 kubeadm、kubelet、kubectl、docker
- 在所有 kubernetes node 节点安装指定版本的 kubeadm、kubelet、docker,在 kubernetes node 节点 kubectl 为可选安装,看是否需要在 node 执行 kubectl 命令进行集群管理及 pod 管理等操作
- 在 kubernetes master 节点运行 kubeadm init 初始化命令
- 验证 kubernetes master 节点状态
- 在 kubernetes node 节点使用 kubeadm 命令将自己加入到 kubernetes master(需要使用 kubernetes master 生成的 token 认证)
- 验证 kubernetes node 节点状态
- 创建 pod 并测试网络通信
- 部署 web 服务 Dashboard
- 实现 kubernetes 集群升级
基础环境准备
- 服务器环境
- 最小化安装基础系统,并关闭防火墙、selinux、swap,更新软件源、同步时间、安装常用命令,重启后验证基础配置。
//临时关闭swap分区
swapoff -a
//永久关闭swap分区
sed -ri 's/.*swap.*/#&/' /etc/fstab
角色 | 主机名 | IP地址 |
---|---|---|
k8s-master1 | kubeadm-master1.bokebi.net | 192.168.26.104 |
k8s-master2 | kubeadm-master2.bokebi.net | 192.168.26.114 |
k8s-master3 | kubeadm-master3.bokebi.net | 192.168.26.124 |
ha1 | ha1.bokebi.net | 192.168.26.134 |
ha2 | ha1.bokebi.net | 192.168.26.144 |
k8s-node1 | node1.bokebi.net | 192.168.26.154 |
k8s-node1 | node2.bokebi.net | 192.168.26.164 |
k8s-node1 | node3.bokebi.net | 192.168.26.174 |
harbor | harbor.bokebi.net | 192.168.26.184 |
Harbor 及反向代理
Keepalived
//安装keepalived
apt install keepalived -y
//查找模板配置文件
find / -name keepalived.conf*
//拷贝模板文件
cp /usr/share/doc/keepalived/samples/keepalived.conf.sample /etc/keepalived/
//修改模板配置文件名
mv /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
//编辑配置文件
vim /etc/keepalived/keepalived.conf
...省略...
vrrp_instance VI_1 {
state MASTER
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.26.248 dev eth0 label eth0:1
}
}
Haproxy
//安装haproxy
apt install haproxy -y
//修改配置文件
vim /etc/haproxy/haaproxy.cfg
...省略...
listen stats #状态页
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth bokebi:123456
listen k8s-api-6443
bind 192.168.26.248:6443 #keepalived定义的vip,kubernetes默认端口为6443
mode tcp
server master1 192.168.26.104:6443 check inter 3s fall 3 rise 5
server master2 192.168.26.114:6443 check inter 3s fall 3 rise 5
server master3 192.168.26.124:6443 check inter 3s fall 3 rise 5
Harbor
//安装docker-compose
apt install docker-compose -y
//确定工作目录
pwd
/usr/local/src
//将harbor安装包传至虚拟机
ls
harbor-offline-installer-v1.7.6.tgz
//解包
tar xf harbor-offline-installer-v1.7.6.tgz
//确定工作目录
pwd
/usr/local/src/harbor
//编辑harbor配置文件
vim harbor.cfg
...省略...
8 hostname = k8s.harbor.com
...省略...
69 harbor_admin_password = 123456
...省略...
//执行安装
./install.sh
//编辑windows的hosts配置文件添加域名解析
C:\Windows\System32\drivers\etc\hosts
...省略...
192.168.26.184 k8s.harbor.com
- 浏览器访问: http://k8s.harbor.com
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i02GXzQc-1634009537291)(http://image.bokebi.cn/blog/20200328/Tm5UqvCzXfww.png?imageslim)]
安装 kubeadm 等组件
- 在 kubernetes master 和 kubernetes node 节点安装 kubeadm、kubelet、docker 等软件
所有 kubernetes master 和 kubernetes node 节点安装 docker
- 安装经过验证的 docker 版本:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.17.md#downloads-for-v1174
- docekr安装步骤: https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b116v4GnP
#!/bin/bash
#更新软件源
#sudo apt-get update -y
#安装必要的一些系统工具
#sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
#安装 GPG 证书
#curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
#写入软件源信息
#sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
#更新软件园
#sudo apt-get update -y
#查看可安装的 docker 版本
#apt-cache madison docker-ce docker-ce-cli
#安装并启动 docker 19.03.8
#sudo apt-get -y install docker-ce=5:19.03.8~3-0~ubuntu-bionic docker-ce-cli=5:19.03.8~3-0~ubuntu-bionic
#验证 docker 版本
#docker -v
#重启 docker
#systemctl daemon-reload && systemctl restart docker.service && systemctl enable docker.service
Kubernetes master 节点配置 docker 加速器
root@master-1:~# sudo tee /etc/docker/daemon.json <<- 'EOF'
> {
> "registry-mirrors":["https://9916w1ow.mirror.aliyuncs.com"]
> }
> EOF #此条命令需要手动输入且回车
{
"registry-mirrors":["https://9916w1ow.mirror.aliyuncs.com"]
}
Kubernetes 所有节点安装 kubectl、kubeadm、kubelet
镜像仓库配置
- 配置阿里云镜像的 kubernetes 源(用于安装 kubelet、kubeadm、kubectl 命令): https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b116v4GnP
- Kubernetes master
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF #需要手动输入且回车
apt-get update
#查看版本信息
apt-cache madison kubelet kubeadm kubectl
#安装指定版本的组件
apt install -y kubeadm=1.17.2-00 kubectl=1.17.2-00 kubelet=1.17.2-00
#启动并验证 kubelet
systemctl start kubelet && systemctl enable kubelet && systemctl status kubelet
- Kubernetes node
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF #需要手动输入且回车
apt-get update
#查看版本信息
apt-cache madison kubelet kubectl
#安装指定版本的组件(kubernetes node 建议不安装 kubectl 组件)
apt install -y kubeadm=1.17.2-00 kubelet=1.17.2-00
#启动并验证 kubelet
systemctl start kubelet && systemctl enable kubelet && systemctl status kubelet
验证 kubernetes master 节点 kubelet 服务
- 目前启动 kubelet 以下报错
Kubernetes master 节点运行 kubeadm init 初始化命令
- 在三台 kubernetes master 中任意一台 master 进行集群初始化,而且集群初始化只需要初始化一次。
- 初始化报错
- 解决以上报错方法
//关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
//临时关闭swap分区
swapoff -a
//永久关闭swap分区
sed -ri 's/.*swap.*/#&/' /etc/fstab
//临时禁用selinux
setenforce 0
//永久关闭 修改/etc/sysconfig/selinux文件设置
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
- 初始化报错
- 解决以上报错方法
Kubeadm 命令使用
Available Commands:
alpha #kubeadm 处于测试阶段的命令
completion #bash 命令补全,需要安装 bash-completion
config #管理 kubeadm 集群的配置,该配置保留在集群的 ConfigMap 中
#kubeadm config print init-defaults(查看默认初始化时执行的操作)
help #关于 kubeadm 命令的帮助
init #启动一个 Kubernetes 主节点
join #将节点加入到已经存在的 kubernetes master
reset #还原使用 kubeadm init 或 kubeadm jain 对系统产生的环境变化
token #管理 token
upgrade #升级 kubernetes 版本
version #打印命令版本信息
- 配置命令补全
//创建脚本存储目录
mkdir /data/scripts -p
//使用 kubeadm 命令生成补全脚本
kubeadm completion bash > /data/scripts/kubeadm_completion.sh
//重新生效补全脚本(仅单次有效)
source /data/scripts/kubeadm_completion.sh
//编写系统环境变量
vim /etc/profile
...省略...
source /data/scripts/kubeadm_completion.sh
//重新生效系统环境变量
source /etc/profile
Kubeadn init 命令简介
- 命令使用: https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/
- 集群初始化: https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
!!--apiserver-advertise-address string!!
#Kubernetes API 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口。
!!--apiserver-bind-port int32!! 默认值:6443
#Kubernetes API 服务器绑定的端口。
--apiserver-cert-extra-sans stringSlice
#可选的证书额外信息,用于指定 Kubernetes API 服务器的证书。可以是 IP 地址也可以是 DNS 名称。
--cert-dir string 默认值:"/etc/kubernetes/pki"
#保存和存储证书的路径。
--certificate-key string
#定义一个用于加密 kubeadm-certs Secret 中的控制平面证书的密钥。
--config string
#kubeadm 配置文件的路径。
!!!--control-plane-endpoint string!!!
#为控制平面指定一个稳定的 IP 地址或 DNS 名称。即配置一个可以长期使用且是高可用的 VIP 或者域名,kubernetes 集群多 master 高可用基于此参数实现。
--cri-socket string
#要连接的 CRI(容器运行时的接口,Container Runtime Interface) 套接字的路径。如果为空,则 kubeadm 将尝试自动检测此值;仅当安装了多个 CRI 或具有非标准 CRI 插槽时,才使用此选项。
--dry-run
#不要应用任何更改;只是输出将要执行的操作及测试运行。
-k, --experimental-kustomize string
#用于存储 kustomize 为静态 pod 清单所提供的补丁的路径。
--feature-gates string
#一组用来描述各种功能特性的键值(key=value)对。选项是:IPv6DualStack=true|false (ALPHA - default=false)
-h, --help
#init 操作的帮助命令
!!--ignore-preflight-errors strings!!
#可以忽略检查过程中出现的报错信息,取值为 'all' 时将忽略检查中的所有错误。
!!--image-repository string!! 默认值:"k8s.gcr.io"
#设置一个用于拉取控制平面镜像的容器仓库
!!--kubernetes-version string!! 默认值:"stable-1"
#指定安装 Kubernetes 版本。
--node-name string
#指定 kubernetes node 节点的名称。
!!--pod-network-cidr string!!
#设置 pod IP 地址范围。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。
!!--service-cidr string!! 默认值:"10.96.0.0/12"
#设置 service 网络地址范围
!!--service-dns-domain string!! 默认值:"cluster.local"
#设置 kubernetes 内部域名,例如:"myorg.internal"。会有相应的 DNS 服务(kube-dns/coredns)解析生成的域名记录。
--skip-certificate-key-print
#不打印用于加密的 key 信息。
--skip-phases stringSlice
#要跳过的阶段列表
--skip-token-print
#跳过打印 token 信息
--token string
#指定 token,这个令牌用于建立控制平面节点与工作节点间的双向通信。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例:abcdef.0123456789abcdef
--token-ttl duration 默认值:24h0m0s
#指定 token 过期时间(例如 1s,2m,3h)。如果设置为 '0',则令牌将永不过期
--upload-certs
#更新证书
- 全局可选项
--add-dir-header
#如果为 true,在日志头部添加日志目录
--log-file string
#如果不为空,将使用此日志文件
--log-file-max-size uint 默认为 1800 兆
#设置日志文件最大大小,单位为兆,值为 0 时表示没有限制
--rootfs string
#宿主机的根路径,也就是绝对路径
--skip-headers
# 如果为 true,在 log 日志里面不显示标题前缀
--skip-log-headers
#如果为 true,在 log 日志里面不显示标题
-v, --v Level
#显示命令版本信息
验证当前 kubeadm 版本
root@master-1:~# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.2", GitCommit:"59603c6e503c87169aea6106f57b9f242f64df89", GitTreeState:"clean", BuildDate:"2020-01-18T23:27:49Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"linux/amd64"}
准备镜像
- 查看安装指定版本的 kubernetes 需要的镜像有哪些
root@master-1:~# kubeadm config images list --kubernetes-version v1.17.2
W0329 02:09:50.843616 6801 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0329 02:09:50.843796 6801 validation.go:28] Cannot validate kubelet config - no validator is available
k8s.gcr.io/kube-apiserver:v1.17.2
k8s.gcr.io/kube-controller-manager:v1.17.2
k8s.gcr.io/kube-scheduler:v1.17.2
k8s.gcr.io/kube-proxy:v1.17.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
Kubernetes master 节点镜像下载
-
推荐提前在 kubernetes master 节点下载镜像以减少安装等待时间,但是镜像默认使用 Google 的镜像仓库,所以国内无法直接下载,但是可以通过阿里云的镜像仓库把镜像先提前下载下来,可以避免后期因为镜像下载异常而导致 kubernetes 部署异常。
-
编写镜像下载脚本
//确定工作目录
pwd
/data/scprits
//编写脚本
vim images-download.sh
#!/bin/bash
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5
//执行脚本
bash images-download.sh
单节点 kubernetes master 初始化
kubeadm init --apiserver-advertise-address=192.168.26.104 --apiserver-bind-port=6443 \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--pod-network-cidr=10.10.0.0/16 --service-cidr=192.168.1.0/21 \
--kubernetes-version=v1.17.2 --service-dns-domain=k8s.service.com \
--ignore-preflight-errors=swap
初始化结果
高可用 kubernetes master 初始化
- 首先基于 keepalived 实现高可用 VIP,然后实现三台 kubernetes master 基于 VIP 实现高可用。
基于命令初始化高可用的 kubernetes master 方式
kubeadm init --apiserver-advertise-address=192.168.26.104 --apiserver-bind-port=6443 \
--control-plane-endpoint=192.168.26.248 --ignore-preflight-errors=swap \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--pod-network-cidr=10.10.0.0/16 --service-cidr=192.168.1.0/21 \
--kubernetes-version=v1.17.2 --service-dns-domain=k8s.service.com
Your Kubernetes control-plane 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 control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join 192.168.26.248:6443 --token dd5530.uhse1xzn1661sbht \
--discovery-token-ca-cert-hash sha256:04b7f3f49b07f116dc03f7116c2d84a2251ad0cb5e019c8ed0ed6082dfabd7d4 \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.26.248:6443 --token dd5530.uhse1xzn1661sbht \
--discovery-token-ca-cert-hash sha256:04b7f3f49b07f116dc03f7116c2d84a2251ad0cb5e019c8ed0ed6082dfabd7d4
基于文件初始化高可用 kubernetes master 方式
//输出默认初始化配置
kubeadm config print init-defaults
//将默认配置输出至文件
# kubeadm config print init-defaults > kubeadm-init.yaml
//修改后的初始化文件内容
cat kubeadm-init.yaml
root@k8s-master1:~# cat kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.26.104 #初始化 master 地址
bindPort: 6443 #端口
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master1 #master 主机名
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.26.248:6443 #添加基于 VIP 的 Endpoint
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #修改为阿里源
kind: ClusterConfiguration
kubernetesVersion: v1.17.2 #kubernetes 版本号
networking:
dnsDomain: k8s.service.com #service 的域名
podSubnet: 10.10.0.0/16 #node 节点地址段
serviceSubnet: 192.168.26.1.0/21 #master 节点地址段
scheduler: {}
//基于 .yaml 文件执行 kubernetes master 初始化
kubeadm init --config kubeadm-init.yaml
配置 kube-config 文件及网路组件
- kube-config 文件中包含 kube-apiserver 地址及相关认证信息
- 报错
- 解决报错
- 出现这个问题的原因是 kubectl 命令需要使用 kubernetes-admin 来运行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
//下载 kube-flannel.yml 文件进行编辑
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
//修改 service 地址段,为刚才我们自定义的地址段 192.168.26.1.0/21
vim kube-flannel.yml
...省略...
126 net-conf.json: |
127 {
128 "Network": "192.168.26.1.0/21",
129 "Backend": {
130 "Type": "vxlan"
131 }
132 }
...省略...
- 验证 master 节点状态
root@k8s-master1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready master 82m v1.17.2
k8s-master2 Ready master 36m v1.17.2
k8s-master3 Ready master 5m10s v1.17.2
当前 kubernetes master 生成证书用于添加新控制节点
//生成证书
root@k8s-master1:~# kubeadm init phase upload-certs --upload-certs
...省略...
W0329 14:56:28.608559 73293 version.go:102] falling back to the local client version: v1.17.2
W0329 14:56:28.608640 73293 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0329 14:56:28.608671 73293 validation.go:28] Cannot validate kubelet config - no validator is available
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
991c53b855713763a717001a69ad1436233d270af6c21aeffadeadb87fa7a25 #用于其他 kubernetes master 加入节点使用
添加新的 kubernetes master 节点
- 在另外一台已经安装了 docker、kubeadm、kubectl 和 kubelet 的 kubernetes master 节点上执行以下操作
- k8s-master2
kubeadm join 192.168.26.248:6443 --token dd5530.uhse1xzn1661sbht \
--discovery-token-ca-cert-hash sha256:04b7f3f49b07f116dc03f7116c2d84a2251ad0cb5e019c8ed0ed6082dfabd7d4 \
--control-plane --certificate-key 991c53b855713763a717001a69ad1436233d270af6c21aeffadeadb87fa7a255 #上一步骤的证书
- k8s-master3
kubeadm join 192.168.26.248:6443 --token dd5530.uhse1xzn1661sbht \
--discovery-token-ca-cert-hash sha256:04b7f3f49b07f116dc03f7116c2d84a2251ad0cb5e019c8ed0ed6082dfabd7d4 \
--control-plane --certificate-key 991c53b855713763a717001a69ad1436233d270af6c21aeffadeadb87fa7a255 #上一步骤的证书
- 报错
- 解决报错
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
- 加入 kubernetes master 集群成功
- haproxy 状态页验证
Kubeadm init 创建 kubernetes 集群流程
验证 kubernetes master 状态
root@k8s-master1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready master 82m v1.17.2
k8s-master2 Ready master 36m v1.17.2
k8s-master3 Ready master 5m10s v1.17.2
验证 kubernetes 集群状态
root@k8s-master1:~# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
当前 csr 证书状态
root@k8s-master1:~# kubectl get csr
NAME AGE REQUESTOR CONDITION
csr-46lb9 50m system:bootstrap:dd5530 Approved,Issued
csr-79kb6 18m system:bootstrap:dd5530 Approved,Issued
csr-nhkzb 52m system:bootstrap:dd5530 Approved,Issued
Kubernetes 集群添加 node 节点
- 在需要加入到 kubernetes 集群中 node 节点都安装 docker、kubeadm、kubelet,因此都要重新执行安装 docker、kubeadm、kubelet 的步骤及即配置 apt 仓库、配置 docker 加速器、安装命令、启动 kubelet 服务。
- node-1
kubeadm join 192.168.26.248:6443 --token dd5530.uhse1xzn1661sbht \
--discovery-token-ca-cert-hash sha256:04b7f3f49b07f116dc03f7116c2d84a2251ad0cb5e019c8ed0ed6082dfabd7d4
- node-2
kubeadm join 192.168.26.248:6443 --token dd5530.uhse1xzn1661sbht \
--discovery-token-ca-cert-hash sha256:04b7f3f49b07f116dc03f7116c2d84a2251ad0cb5e019c8ed0ed6082dfabd7d4
- node-3
kubeadm join 192.168.26.248:6443 --token dd5530.uhse1xzn1661sbht \
--discovery-token-ca-cert-hash sha256:04b7f3f49b07f116dc03f7116c2d84a2251ad0cb5e019c8ed0ed6082dfabd7d4
- 报错
- 忘记装 docker 了,执行脚本装一下😂
- node 节点成功加入集群
- 注: node 节点会自动加入到 master 节点下载镜像并启动 flannel,直到最终在 master 看到 node 处于 Ready 状态 。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A3MVFDPH-1634009537303)(http://image.bokebi.cn/blog/20200329/vcjg7vACLmPE.png?imageslim)]
验证 kubernetes node 节点状态
root@k8s-master1:~# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready master 118m v1.17.2
k8s-master2 Ready master 72m v1.17.2
k8s-master3 Ready master 41m v1.17.2
node-1 Ready <none> 8m26s v1.17.2
node-2 Ready <none> 12m v1.17.2
node-3 Ready <none> 12m v1.17.2
//删除节点
kubectl delete node "node NAME"
Kubernetes 创建容器并测试网络
- 创建 测试容器,测试 网络连接 是否可以 通信
root@k8s-master1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready master 3h14m v1.17.2
k8s-master2 Ready master 149m v1.17.2
k8s-master3 Ready master 117m v1.17.2
node-1 Ready <none> 84m v1.17.2
node-2 Ready <none> 89m v1.17.2
node-3 Ready <none> 89m v1.17.2
root@k8s-master1:~# kubectl run net-test2 --image=alpine --replicas=2 sleep 360000
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/net-test2 created
root@k8s-master1:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
net-test2-8456fd74f7-ckpsr 1/1 Running 0 16m 10.10.6.2 node-1 <none> <none>
net-test2-8456fd74f7-nbzx8 1/1 Running 0 16m 10.10.4.3 node-2 <none> <none>
root@k8s-master1:~# kubectl exec -it net-test2-8456fd74f7-ckpsr sh
/ # ping www.baidu.com
PING www.baidu.com (61.135.169.121): 56 data bytes
64 bytes from 61.135.169.121: seq=0 ttl=127 time=7.641 ms
64 bytes from 61.135.169.121: seq=2 ttl=127 time=23.459 ms
64 bytes from 61.135.169.121: seq=4 ttl=127 time=22.034 ms
64 bytes from 61.135.169.121: seq=5 ttl=127 time=13.348 ms
^C
--- www.baidu.com ping statistics ---
8 packets transmitted, 4 packets received, 50% packet loss
round-trip min/avg/max = 7.641/16.620/23.459 ms
部署 web 服务 dashboard
- GitHub项目地址: https://github.com/kubernetes/dashboard
- 需要下载的镜像文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Byj4AcK1-1634009537304)(http://image.bokebi.cn/blog/20200329/I6nfpaH288qm.png?imageslim)]
部署 dashboard 2.0.0-rc6
//拉取镜像 dashboard 2.0.0-rc6/metrics-scraper:v1.0.3
docker pull kubernetesui/metrics-scraper:v1.0.3
docker pull kubernetesui/dashboard:v2.0.0-rc6
//在所有 kubernetes node 节点添加域名解析,以及需要向 harbor 上传镜像的主机添加
vim /etc/hosts
192.168.26.184 k8s.harbor.com
//查找允许登录 docker login 的配置参数
dockerd --help | grep insecure
--insecure-registry
//在所有 kubernetes node 节点添加域名解析,以及需要向 harbor 上传镜像的主机添加
vim /lib/systemd/system/docker.service
--insecure-registry k8s.harbor.com
//重新加载配置
systemctl daemon-reload
//重启 docker
systemctl restart docekr.service
- 在 harbor 新建项目
//我们在 kubernetes master-1 上下载 dashboard 2.0.0-rc6/metrics-scraper:v1.0.3 镜像
root@k8s-master1:~# docker images
REPOSITORY TAG IMAGE ID CREATED
kubernetesui/dashboard v2.0.0-rc6 cdc71b5a8a0e 2 weeks ago
kubernetesui/metrics-scraper v1.0.3 3327f0dbcb4a 8 weeks ago
//打标签并上传 dashboard 2.0.0-rc6 镜像到 harbor
root@k8s-master1:~# docker tag cdc71b5a8a0e k8s.harbor.com/base-images/dashboard:v2.0.0-rc6
root@k8s-master1:~# docker push k8s.harbor.com/base-images/dashboard:v2.0.0-rc6
//打标签并上传 metrics-scraper:v1.0.3 镜像到 harbor
root@k8s-master1:~# docker tag 3327f0dbcb4a k8s.harbor.com/base-images/metrics-scraper:v1.0.3
root@k8s-master1:~# docker push k8s.harbor.com/base-images/metrics-scraper:v1.0.3
- 验证 harbor 仓库镜像
- 准备所需启动文件
- k8s.master1
//修改文件 dashboard-2.0.0-rc6.yml 中拉取镜像地址(地址为我们配的 harbor 仓库镜像地址)
vim dashboard-2.0.0-rc6.yml
//改端口
30 ---
31
32 kind: Service
33 apiVersion: v1
34 metadata:
35 labels:
36 k8s-app: kubernetes-dashboard
37 name: kubernetes-dashboard
38 namespace: kubernetes-dashboard
39 spec:
40 type: NodePort
41 ports:
42 - port: 443
43 targetPort: 8443
44 nodePort: 30002 #端口
45 selector:
46 k8s-app: kubernetes-dashboard
//改拉取镜像的地址
191 - name: kubernetes-dashboard
192 image: k8s.harbor.com/base-images/dashboard:v2.0.0-rc6 #地址
193 imagePullPolicy: Always
194 ports:
//改拉取镜像的地址
275 - name: dashboard-metrics-scraper
276 image: k8s.harbor.com/base-images/metrics-scraper:v1.0.3 #地址
277 ports:
//执行我们配置好的 .yml 文件
kubectl apply -f dashboard-2.0.0-rc6.yml -f admin-user.yml
//验证 pod 是否 READY
kubectl get pod -A
kubectl get service -A
//在各个 kubernetes node 节点验证端口 30002
ss -ntl
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iRChNZSA-1634009537306)(http://image.bokebi.cn/blog/20200329/Y73bjoKRQnqv.png?imageslim)]
- 需要 token 进行登录
获取登录 token
root@k8s-master1:/usr/local/src# kubectl get secret -A | grep admin-user
kubernetes-dashboard admin-user-token-mwfkw kubernetes.io/service-account-token 3 88m
root@k8s-master1:/usr/local/src# kubectl describe secret admin-user-token-mwfkw -n kubernetes-dashboard
Name: admin-user-token-mwfkw
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: cffabb76-b86f-488a-9a60-e5989e4599be
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6Iml1V3hDZGh6YnFrY2ZqWjAyMW9sdENlanc1QVI4eG9zWHIzNHUtQWd3aU0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLW13Zmt3Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJjZmZhYmI3Ni1iODZmLTQ4OGEtOWE2MC1lNTk4OWU0NTk5YmUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.KlNQqvVbNR0doZu9rggWBNISCx_CBTAro0zYkcVA528TExYayQWTQF6F8hF2QbY6eYvclVgiYTgYAHsuQu-TR0WMXBrUuoVXL51ARD0nMYUZouNzGGalEw5bYVBes1H5OefXqHKKsMkV1njd87aoTnGOH57_-v88v6hG-UIjI12FBVHXHctZ63-qCYTRSOyHPpbZQI8PAl0huYLIocaCttup19uC4UHdfU4dazFMCWGCXR6l_SH8kzi_Ybes95ERZ5v8OBmh-A9x6IvYG0O4aH-Oc0vO7mVtHmcVRvn2UGNNqjgCaIIJpAyfIp_ypTadkSXHyTrX9guqz2djEHN8vg
验证 NodePort
使用获取的 token 登录 dashboard
登陆成功
集群升级
- 升级 kubernetes 集群必须先升级 kubeadm 版本到对应 kubernetes 的版本。也就是说 kubeadm 是 kubernetes 的 "升级通行证"。
升级 kubernetes master 服务
- 在 kubernetes 的所有 master 进行升级,将管理端服务 kube-controller-manager、kube-apiserver、kube-scheduler、kube-proxy
验证当前 kubernetes 版本
kubeadm version: &version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.2", GitCommit:"59603c6e503c87169aea6106f57b9f242f64df89", GitTreeState:"clean", BuildDate:"2020-01-18T23:27:49Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"linux/amd64"}
各 master 安装指定版本的 kubeadm
//查看 kubeadm 可安装版本
root@k8s-master1:~# apt-cache madison kubeadm
//安装指定版本的 kubeadm
root@k8s-master1:~# apt-get install kubeadm=1.17.4-00
//验证 kubeadm 版本
kubeadm version
root@k8s-master1:~# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.4", GitCommit:"8d8aa39598534325ad77120c120a22b3a990b5ea", GitTreeState:"clean", BuildDate:"2020-03-12T21:01:11Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
查看 Kubeadm 升级命令帮助
- kubeadm upgrade --help 查看升级帮助
root@k8s-master1:~# kubeadm upgrade --help
Upgrade your cluster smoothly to a newer version with this command
Usage:
kubeadm upgrade [flags]
kubeadm upgrade [command]
Available Commands:
apply Upgrade your Kubernetes cluster to the specified version
diff Show what differences would be applied to existing static pod manifests. See also: kubeadm upgrade apply --dry-run
node Upgrade commands for a node in the cluster
plan Check which versions are available to upgrade to and validate whether your current cluster is upgradeable. To skip the internet check, pass in the optional [version] parameter
升级计划
- kubeadm upgrade plan 查看升级计划
开始升级
//注意:如果为高可用集群,在升级过程中,是需要将升级的 kubernetes master 在 ha 中停止对外调度的 (也就是说类似于滚动升级)
kubeadm upgrade apply v1.17.4 #k8s-master1
kubeadm upgrade apply v1.17.4 #k8s-master2
kubeadm upgrade apply v1.17.4 #k8s-master3
验证镜像
升级 kubernetes node 服务
升级客户端服务 kubectl kubelet
验证当前 node 版本信息
- node 节点还是 v1.17.2 的旧版本
root@k8s-master1:~# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready master 10h v1.17.2
k8s-master2 Ready master 9h v1.17.2
k8s-master3 Ready master 8h v1.17.2
node-1 Ready <none> 8h v1.17.2
node-2 Ready <none> 8h v1.17.2
node-3 Ready <none> 8h v1.17.2
升级各 kubernetes node 节点配置文件
- kubeadm upgrade node --kubelet-version v1.17.4
[upgrade] Reading configuration from the cluster...
[upgrade] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config
[upgrade] Upgrading your Static Pod-hosted control plane instance to version "v1.17.4"...
Static pod: kube-apiserver-k8s-master1 hash: 78cedb3b8d473e09de02321715010ad9
Static pod: kube-controller-manager-k8s-master1 hash: f986b0573562f9c62a1b38929e390ae7
Static pod: kube-scheduler-k8s-master1 hash: 0621ae8690c69d1d72f746bc2de0667e
[upgrade/etcd] Upgrading to TLS for etcd
[upgrade/etcd] Non fatal issue encountered during upgrade: the desired etcd version for this Kubert continue
[upgrade/staticpods] Writing new Static Pod manifests to "/etc/kubernetes/tmp/kubeadm-upgraded-man
W0330 00:58:26.170611 48993 manifests.go:214] the default kube-apiserver authorization-mode is "
[upgrade/staticpods] Preparing for "kube-apiserver" upgrade
[upgrade/staticpods] Current and new manifests of kube-apiserver are equal, skipping upgrade
[upgrade/staticpods] Preparing for "kube-controller-manager" upgrade
[upgrade/staticpods] Current and new manifests of kube-controller-manager are equal, skipping upgr
[upgrade/staticpods] Preparing for "kube-scheduler" upgrade
[upgrade/staticpods] Current and new manifests of kube-scheduler are equal, skipping upgrade
[upgrade] The control plane instance for this node was successfully updated!
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.17" ConfigMap
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[upgrade] The configuration for this node was successfully updated!
[upgrade] Now you should go ahead and upgrade the kubelet package using your package manager.
在各个 kubernetes node 节点升级 kubelet 二进制包
- 包含 kubernetes master 节点在的 kubectl、kubelet 也要升级
apt install kubeadm=1.17.4-00 kubelet=1.17.4-00 #node-1
apt install kubeadm=1.17.4-00 kubelet=1.17.4-00 #node-2
apt install kubeadm=1.17.4-00 kubelet=1.17.4-00 #node-3
- 验证最终版本
root@k8s-master1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready master 10h v1.17.4
k8s-master2 Ready master 9h v1.17.4
k8s-master3 Ready master 9h v1.17.4
node-1 Ready <none> 8h v1.17.4
node-2 Ready <none> 8h v1.17.4
node-3 Ready <none> 8h v1.17.4
测试运行 Nginx+Tomcat
- Deployment 控制器: https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/
- 测试运行 nginx,并最终可以实现动静分离
运行 nginx
//拉取 nginx 镜像
docker pull nginx:1.14.2
//打标签
docker tag nginx:1.14.2 k8s.harbor.com/base-images/nginx:1.14.2
//上传至本地 harbor
docker push k8s.harbor.com/base-images/nginx:1.14.2
//创建运行 app 的 .yml 文件存储目录
mkdir /opt/kubdadm-yaml/nginx -p
//确定工作目录
pwd
/opt/kubdadm-yaml/nginx
//编写 nginx.yml 文件(选择 v1.17 版本模板)
vim nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1 #副本数
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.harbor.com/base-images/nginx:1.14.2 #修改为本地 harbor 镜像地址
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
labels:
app: magedu-nginx-service-label
name: magedu-nginx-service
namespace: default
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
nodePort: 30004
selector:
app: nginx
//运行 nginx.yml 文件
root@k8s-master1:/opt/kubdadm-yaml/nginx# kubectl apply -f nginx.yml
deployment.apps/nginx-deployment created
service/magedu-nginx-service created
//验证 pod
root@k8s-master1:/opt/kubdadm-yaml/nginx# kubectl get pod
NAME READY STATUS RESTARTS AGE
net-test1-5fcc69db59-c2plf 1/1 Running 1 9h
net-test1-5fcc69db59-xzvrl 1/1 Running 1 9h
net-test2-8456fd74f7-ckpsr 1/1 Running 1 9h
net-test2-8456fd74f7-nbzx8 1/1 Running 1 9h
nginx-deployment-5f4dc447b5-4l6hs 1/1 Running 0 51m
运行 tomcat
- 测试
//创建 tomcat 及 app 存储数据目录
mkdir /opt/kubdadm-yaml/tomcat/tomcat-app/app -p
//确定工作环境
pwd
/opt/kubdadm-yaml/tomcat/tomcat-app
//编写 Dockerfile 文件
vim Dockerfile
FROM tomcat
ADD ./app /usr/local/tomcat/webapps/app/
//确定工作目录
pwd
/opt/kubdadm-yaml/tomcat/tomcat-app/app
//编写 tomcat 测试页面
vim index.html
tomcat-test-page
- 浏览器访问: http://k8s.harbor.com 并创建新项目
//确定工作目录
pwd
/opt/kubdadm-yaml/tomcat/tomcat-app
//打镜像
docker build -t k8s.harbor.com/bokebi/tomcat:app .
//测试 tomcat 是否在容器正常运行
docker run -it --rm 8080:8080 tom k8s.harbor.com/bokebi/tomcat:app
//将打好的镜像打标签
docker tag k8s.harbor.com/bokebi/tomcat:app k8s.harbor.com/bokebi/tomcat:app
//上传镜像至本地 harbor 仓库
docker push k8s.harbor.com/bokebi/tomcat:app
- 编写运行 tomcat 的 .yml 文件
//确定工作目录
pwd
/opt/kubdadm-yaml/tomcat/
//编写 tomcat.yml 文件
vim tomcat.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 1 #副本数
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: k8s.harbor.com/bokebi/tomcat:app #修改为本地 harbor 镜像地址
ports:
- containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
labels:
app: magedu-tomcat-service-label
name: magedu-tomcat-service
namespace: default
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
#nodePort: 30005 #仅用于测试,一但测试成功,立即关闭
selector:
app: tomcat
//运行 tomcat.yml 文件
root@k8s-master1:/opt/kubdadm-yaml/tomcat# kubectl apply -f tomcat.yml
deployment.apps/tomcat-deployment created
service/magedu-tomcat-service created
//验证 pod
root@k8s-master1:/opt/kubdadm-yaml/nginx# kubectl get pod
NAME READY STATUS RESTARTS AGE
net-test1-5fcc69db59-c2plf 1/1 Running 1 9h
net-test1-5fcc69db59-xzvrl 1/1 Running 1 9h
net-test2-8456fd74f7-ckpsr 1/1 Running 1 9h
net-test2-8456fd74f7-nbzx8 1/1 Running 1 9h
nginx-deployment-5f4dc447b5-4l6hs 1/1 Running 0 51m
tomcat-deployment-5cd65b4d74-d4x7s 1/1 Running 0 2m48s
Dashboard 验证 pod
web 界面验证 Pod
从 dashboard 进入容器
测试访问 nginx
测试访问 tomcat
Nginx 实现动静分离
Nginx 配置
root@k8s-master1:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
net-test1-5fcc69db59-c2plf 1/1 Running 1 9h
net-test1-5fcc69db59-xzvrl 1/1 Running 1 9h
net-test2-8456fd74f7-ckpsr 1/1 Running 1 9h
net-test2-8456fd74f7-nbzx8 1/1 Running 1 9h
nginx-deployment-5f4dc447b5-4l6hs 1/1 Running 0 70m
tomcat-deployment-5cd65b4d74-d4x7s 1/1 Running 0 21m
root@k8s-master1:~# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 192.168.0.1 <none> 443/TCP 12h
magedu-nginx-service NodePort 192.168.2.40 <none> 80:30004/TCP 70m
magedu-tomcat-service NodePort 192.168.1.200 <none> 80:30005/TCP 21m
- 通过 dashboard 进入 nginx : https://192.168.26.104:30002
//或者以容器方式
kubectl exec -it nginx-deployment-5f4dc447b5-4l6hs bash
//更新软件源
apt update
//安装基础命令
apt install procps vim iputils-ping net-tools curl
//测试 service 解析
ping magedu-tomcat-service
PING magedu-tomcat-service.default.svc.k8s.service.com (192.168.1.200) 56(84) bytes of data.
//测试在 nginx pod 通过 tomcat pod 的 service 域名访问
curl magedu-tomcat-service/app/index.html
tomcat-test-page
//修改 nginx 配置文件实现动静分离,nginx 一旦接收到 /app 的 uri 就转发给 tomcat
vim /etc/nginx/conf.d/default.conf
...省略...
location /app {
proxy_pass http://magedu-tomcat-service;
}
...省略...
//测试配置文件
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
//重新加载配置文件
nginx -s reload
2020/03/29 19:06:47 [notice] 4099#4099: signal process started
-
访问 web 页面,验证动静分离
-
浏览器访问: http://192.168.26.144:30004/
通过 HAProxy 实现高可用反向代理
- 基于 haproxy 和 keepalived 实现高可用的反向代理,并访问到运行在 kubernetes 集群忠业务 Pod
Keepalived VIP 配置
//编辑配置文件
vim /etc/keepalived/keepalived.conf
...省略...
vrrp_instance VI_1 {
state MASTER
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.26.248 dev eth0 label eth0:1
192.168.26.249 dev eth0 label eth0:2
}
}
HAProxy 反向代理配置
//修改配置文件
vim /etc/haproxy/haaproxy.cfg
...省略...
listen stats #状态页
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth bokebi:123456
listen k8s-api-6443
bind 192.168.26.248:6443 #keepalived 定义的 vip,kubernetes 默认端口为6443
mode tcp
balance roundrobin
server 192.168.26.104 192.168.26.104:6443 check inter 3s fall 3 rise 5
server 192.168.26.114 192.168.26.114:6443 check inter 3s fall 3 rise 5
server 192.168.26.124 192.168.26.124:6443 check inter 3s fall 3 rise 5
listen k8s-web-80
bind 192.168.26.249:80
mode tcp
balance roundrobin
server 192.168.26.144 192.168.26.144:30004 check inter 3 rise 5 #在 node 节点,定义的 NodePort 的端口
server 192.168.26.154 192.168.26.154:30004 check inter 3 rise 5
server 192.168.26.164 192.168.26.164:30004 check inter 3 rise 5
测试通过 VIP 访问
kubeadm 其他命令
token 管理
Usage:
kubeadm token [flags]
kubeadm token [command]
Available Commands:
create #在服务上创建引导令牌(即 token,默认有效期为 24 小时)
delete #删除服务器上的引导令牌(即删除 token)
generate #生成并打印 token ,但不在服务器上创建,即将 token 用于其他操作
list #列出服务器所有的 token