Kubernetes-简介及规划部署

Kubernetes 简介及规划部署

mark

  • Kubernetes 核心优势
    • 基于 yaml 文件实现容器的自动创建、删除
    • 更快速实现业务的弹性横向扩展
    • 动态发现新扩容的容器并自动对用户提供访问
    • 更简单、更快捷的实现业务代码升级和回滚

Kubernetes 组件介绍

  • https://k8smeetup.github.io/docs/admin/kube-apiserver/

  • kube-apiserver:Kubernetes API 服务器为 api 对象验证并配置数据,包括 pod,服务(Services),复制控制器(Replication controller)和其他 api 对象。API 服务器提供 REST 限制操作和到集群共享状态的前端,所有其他组件通过它进行交互。

  • https://k8smeetup.github.io/docs/admin/kube-scheduler/

  • 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 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。

  • https://k8smeetup.github.io/docs/admin/kube-proxy/

  • kube-proxy:Kubernetes 网络代理运行在 nodes 上。它反映了 node 上 Kubernetes API 中定义的服务,并可以通过一组后端进行简单的 TCP、UDP 流转发或循环模式 (round robin) 的 TCP、UDP 转发。目前,服务的集群 IP 和端口是通过 Docker-links 兼容的环境变量发现的,这些环境变量指定了服务代码打开的端口。有一个可选的 addon 为这些集群 IP 提供集群 DNS。用户必须使用 apiserver API 创建一个服务来配置代理。其实,就是 kube-proxy 通过在主机上维护网络规则并执行连接转发来实现 Kubernetes 服务访问。

  • https://k8smeetup.github.io/docs/admin/kubelet/

  • 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 节点执行容器健康检查
  • https://github.com/etcd-io/etcd

  • etcd:etcd 是 CorOS 公司开发目前是 Kubernetes 默认使用的 key-value 数据存储系统,用于保存所有集群数据,支持分布式集群功能,生产环境使用时需要为 etcd 数据提供定期备份机制。

  • 新版本组件介绍:https://kubernetes.io/zh/docs/concepts/overview/components/

部署规划图

安装方式

部署工具

  • 使用批量部署工具如(ansible/saltstack)、手动二进制、kubeadm、apt-get/yum 等方式安装,一守护进程的方式启动在宿主机上,类似于时 Nginx 一样使用 service 脚本启动。

Kubeadm 工具

安装注意事项

注意:禁用 swap、selinux、iptables

Kubernetes 部署过程

  • 具体步骤

    • 当前部署版本为当前次新版本,因为后面需要使用 kubeadm 做 kubernetes 版本升级演示。
    • 目前官方最新版本为 v1.19.0,因此本次先以 v1.17.4 版本 kubernetes 为例。
  • https://github.com/kubernetes/kubernetes/releases

mark

  • 安装思路
    • 主机基础环境准备
    • 部署 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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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

#!/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

镜像仓库配置

mark

  • 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 以下报错

mark

Kubernetes master 节点运行 kubeadm init 初始化命令

  • 在三台 kubernetes master 中任意一台 master 进行集群初始化,而且集群初始化只需要初始化一次。
  • 初始化报错

mark

  • 解决以上报错方法
//关闭防火墙
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
  • 初始化报错

mark

  • 解决以上报错方法

mark

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 命令简介

!!--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

mark

单节点 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 
初始化结果

mark

高可用 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

mark

基于文件初始化高可用 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 地址及相关认证信息
  • 报错

mark

  • 解决报错
    • 出现这个问题的原因是 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 #上一步骤的证书
  • 报错

mark

  • 解决报错
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
  • 加入 kubernetes master 集群成功

mark

  • haproxy 状态页验证

mark

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 了,执行脚本装一下😂

mark

  • 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

mark

  • 需要下载的镜像文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 新建项目

mark

//我们在 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 仓库镜像

mark

  • 准备所需启动文件
- 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 进行登录

mark

获取登录 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

mark

使用获取的 token 登录 dashboard

mark

登陆成功

mark

集群升级

  • 升级 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 查看升级计划

mark

开始升级
//注意:如果为高可用集群,在升级过程中,是需要将升级的 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

mark

mark

验证镜像

mark

升级 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.

mark

在各个 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

运行 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

mark

运行 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

mark

//确定工作目录
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

mark

//将打好的镜像打标签
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

mark

Dashboard 验证 pod

web 界面验证 Pod

mark

从 dashboard 进入容器

mark

测试访问 nginx

mark

测试访问 tomcat

mark

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
//或者以容器方式
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

mark

mark

通过 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 访问

mark

mark

kubeadm 其他命令

token 管理

Usage:
  kubeadm token [flags]
  kubeadm token [command]

Available Commands:
  create      #在服务上创建引导令牌(即 token,默认有效期为 24 小时)
  delete      #删除服务器上的引导令牌(即删除 token)
  generate    #生成并打印 token ,但不在服务器上创建,即将 token 用于其他操作
  list        #列出服务器所有的 token
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注