Kubeadm 快速搭建 k8s v1.19.1 集群(Ubuntu Server 20.04 LTS)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
云防火墙,500元 1000GB
简介: 安装准备工作安装环境要求:角色 实验环境 生产环境 操作系统 master cpu/内存:2 Core/2G cpu/内存:2 Core/4G linux 内核 4.4+ node cpu/内存:1 Core/2G cpu/内存:4 Core/16G linux 内核 4.4+ 备注 Node:应根据需要运行的容器数量进行配置; Linux 操作系统基于 x86_64 架构的各种 Linux 发行版...

安装准备工作

说明:以下配置要求为开发环境部署最小规格,不建议生产环境按照此规格搭建部署环境。
  • 安装环境要求
角色 实验环境 生产环境 操作系统
master cpu/内存:2 Core/2G cpu/内存:2 Core/4G linux 内核4.4+
node cpu/内存:1 Core/2G cpu/内存:4 Core/16G linux 内核4.4+
备注

Node:应根据需要运行的容器数量进行配置;
Linux 操作系统基于 x86_64 架构的各种 Linux 发行版本,Kernel 版本要求在 4.4 及以上;【查看 Linux 内核:$ uname -f】

以下环境配置 OS 基于 Linux for ubuntu-server 20.04

Linux Kernel =》5.4.0-47-generic

查看 linux 内核版本=》在命令行中查看 Linux 内核版本的3种方法_Linux教程_Linux公社-Linux系统门户网站

说明 以上为建议配置,实际安装过程中,Master 必须 2 core 及以上(否则安装失败,切记),Node 可以采用 1 core。
  • 单 Master 部署环境说明
主机 配置 组件 ip
k8s-master01

cpu/内存:2 Core/2G

硬盘:40GB

网络模式:桥接

kube-apiserver,

kube-controller-manager,kube-scheduler,

etcd

192.168.0.168
k8s-node01

cpu/内存:2 Core/2G

硬盘:40GB

网络模式:桥接

kubelet,

kube-proxy,

docker etcd

192.168.0.116
k8s-node02

cpu/内存:2 Core/2G

硬盘:40GB

网络模式:桥接

kubelet,

kube-proxy,

docker etcd

192.168.0.154
备注

linux 版本:ubuntu-20.04-live-server-amd64.iso

kubernetes 版本:v1.19.1

docker 版本:v19.03.8-ce

vm 版本:VMware Workstation Pro 15.6

客户端使用 xshell6 连接到 vm 中 linux 系统方便安装配置;

说明

以上配置为 3 节点主机的单 Master 架构的最小规模集群配置,配置环境均在 vm 中部署安装,宿主机固定静态 IP,保障 vm 中 linux 系统的网络在同一网段,使用桥接模式,宿主机和 vm 系统之间能相互通信,vm 中系统能正常访问外网;

生产环境建议扩展多 Master 架构集群部署,node 节点根据部署容器数量预估配置;

  • 单 Master 架构图

image.png

操作系统初始化配置

2.1 关闭 UFW(Uncomplicated Firewall)防火墙

Ubuntu20.04 一般都默认安装了 UFW(Uncomplicated Firewall) 防火墙服务,它是一款轻量化的工具,主要用于对输入输出的流量进行监控。而 KubernetesMaster 与工作 Node 之间会有大量的网络通信,安全的做法是在防火墙上配置 Kbernetes 各组件(api-server、kubelet 等等)需要相互通信的端口号。在安全的内部网络环境中可以关闭防火墙服务。

# 查看防火墙状态
$ sudo ufw status verbose
 
# 关闭ubuntu的防火墙
$ sudo ufw disable 
  • Status: inactive 说明防火墙未运行
  • Status: active 说明防火墙在运行

参考:

2.2 关闭 SELinux

安全增强型 Linux(Security-Enhanced Linux) 简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。

  • SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。
  • SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。

关闭 SELinux 的两种方法

  1. 永久方法 – 需要重启服务器

修改 /etc/selinux/config 文件中设置 SELINUX=disabled,然后重启服务器。

  1. 临时方法 – 设置系统参数

使用命令 setenforce 0

参数说明:

  • setenforce 1 设置 SELinux 成为 enforcing 模式
  • setenforce 0 设置 SELinux 成为 permissive 模式
# 安装 selinux-utils 
$ apt install selinux-utils
 
# 查看 selinux 是否关闭
$ getenforce
 
# 临时
$ setenforce 0
 
# 永久
$ sed -i 's/enforcing/disabled/' /etc/selinux/config    

2.3 关闭 swap 内存分区

这个 swap 其实可以类比成 windows 上的虚拟内存,它可以让服务器在内存吃满的情况下可以保持低效运行,而不是直接卡死。但是 k8s 的较新版本都要求关闭 swap,修改 /etc/fstab 文件:

# 临时
$ sudo swapoff -a  
 
# 永久,修改/etc/fstab,注释掉swap那行,持久化生效
$ sudo vi /etc/fstab

2.4 根据规划设置主机名

# 查看主机名称
$ hostname 
 
# 设置主机名称
$ hostnamectl set-hostname <hostname> 

2.5 在 Master 添加 hosts

hosts 文件的作用相当如 DNS(Domain Name System),提供 IP 地址到 hostname 的映射。早期的互联网计算机少,单机 hosts 文件里足够存放所有联网计算机。不过随着互联网的发展,这就远远不够了。于是就出现了分布式的 DNS 系统。由 DNS 服务器来提供类似的 IP 地址到域名的对应。具体可以 man hosts/etc/hosts 中包含了 IP 地址和主机名之间的映射,还包括主机名的别名。

hosts 文件的配置格式是: IP FQDN alias,其中全域名 (FQDN,Fully Qualified Domain Name) 是指主机名加上全路径,全路径中列出了序列中所有域成员。全域名可以从逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名的一种完全表示形式。从全域名中包含的信息可以看出主机在域名树中的位置。

Linux 系统在向 DNS 服务器发出域名解析请求之前会查询 /etc/hosts 文件,如果里面有相应的记录,就会使用 hosts 里面的记录。

此处 hosts 类似 DNS(Domain Name System) DNS 可以降低延迟,但是不能提高上下行网速

$ cat >> /etc/hosts << EOF
172.26.16.100 k8s-master01
172.26.16.101 k8s-node01
172.26.16.102 k8s-node02
EOF
注意:此处添加 hosts 防止重启 linux 系统后,IP 无效,可以事先根据规划的网段设置好静态IP地址,操作如下:Ubuntu 18.04 配置静态IP地址。

使用 Netplan(新一代网络配置工具)工具配置网络

1. 备份系统默认 /etc/netplan/*.yaml 文件

$ sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak

2. 编写 /etc/netplan/*.yaml 文件

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:  #配置的网卡名称
      dhcp4: false  #dhcp4关闭
      dhcp6: false  #dhcp6关闭
      addresses: [172.26.16.100/16]  #设置本机IP及掩码
      gateway4: 172.26.16.1  #设置网关
      nameservers:
        addresses: [114.114.114.114, 8.8.8.8]  #设置DNS
  • eth0 - 网络接口名称。
  • dhcp4 和 dhcp6 - 接受 IPv4 和 IPv6 接口的 dhcp 属性。
  • addresses - 接口的静态地址序列。
  • gateway4 - 默认网关的 IPv4 地址。
  • nameservers - nameservers 的 IP 地址序列。

DNS 可以配置多个,配置列表见附件。

IP 地址段和子网掩码对照表 =》

3. 执行 apply 命令,使 yaml 配置生效

$ netplan apply -f 00-installer-config.yaml

附:国内知名公共DNS服务器IP

  • 腾讯DNS:119.29.29.29、 182.254.116.116
  • 阿里DNS:223.5.5.5、 223.6.6.6
  • 百度DNS:180.76.76.76
  • 114DNS:114.114.114.114、 114.114.115.115
  • CNNIC DNS:1.2.4.8、 210.2.4.8
  • OneDNS:117.50.11.11、 117.50.22.22
  • Hi!XNS DNS服务器:40.73.101.101
  • 清华大学TUNA协会DNS服务器:101.6.6.6
  • Google Public DNS:8.8.8.8、8.8.4.4

2.6 时间同步,确保时区和时间正确

每个宿主机上都要确保时区和时间是正确的。如果时区不正确,请使用下面的命令来修改:

$ sudo timedatectl set-timezone Asia/Shanghai
 
#修改后,如果想使得系统日志的时间戳也立即生效,则:
$ sudo systemctl restart rsyslog 

(Ubuntu如何同步网络时间,https://www.cnblogs.com/zhongguiyao/p/9293764.html)装完Ubuntu设置完时间,重启总是恢复设置前的时间。

  • 设定时区:dpkg-reconfigure tzdata
  • 选择Asia -> 再选择Shanghai -> OK

解决方法:

# 1.安装ntpdate工具
$ sudo apt install ntpdate -y
 
# 2.将系统时间与网络同步
$ ntpdate cn.pool.ntp.org
 
# 3.将时间写入硬件
$ hwclock --systohc
 
# 4.查看时间是否已同步
$ date 

2.7 关闭 suspend(待机/休眠),确保每个机器不会自动待机/休眠;

$ sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

2.8 设置 iptables 可以看到 bridged traffic / 将桥接的 IPv4 流量传递到 iptables 的链

先确认 Linux 内核加载了 br_netfilter 模块:

$ lsmod | grep br_netfilter
注意:确保 sysctl 配置中 net.bridge.bridge-nf-call-iptables 的值设置为了 1。

Ubuntu 20.04 Server 上,这个值就是 1。如果你的系统上不一致,使用下面的命令来修改:

$ cat << EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
 
$ sudo sysctl --system # 生效
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
 
$ sudo sysctl --system  # 生效

2.9 设置 rp_filter 的值

因为 K8s 集群即将部署的是 calico 网络插件,而 calico 需要这个内核参数是 0 或者 1,但是 Ubuntu20.04 上默认是 2,这样就会导致 calico 插件报下面的错误(这是个 fatal 级别的 error):

int_dataplane.go 1035: Kernel's RPF check is set to 'loose'.  \
This would allow endpoints to spoof their IP address.  \
Calico requires net.ipv4.conf.all.rp_filter to be set to 0 or 1. \
If you require loose RPF and you are not concerned about spoofing, \
this check can be disabled by setting the IgnoreLooseRPF configuration parameter to 'true'.

使用下面的命令来修改这个参数的值:

# 修改/etc/sysctl.d/10-network-security.conf
$ sudo vi /etc/sysctl.d/10-network-security.conf
 
# 将下面两个参数的值从2修改为1
$ net.ipv4.conf.default.rp_filter=1
$ net.ipv4.conf.all.rp_filter=1
 
# 然后使之生效
$ sudo sysctl --system

2.10 重启 Linux 系统

$ shutdown -r now #重启系统

安装基础软件

Kubernetes1.20.x 版本以前默认 CRI/Container Runtime Interface(容器运行时)为 Docker,因此此处先安装 Docker

关于 CRI 的一些实现:

  • CRI-containerd 是目前社区中比较主流的新一代 CRI 的实现;
  • CRI-O 来自于红帽公司基于 Open Container InitiativeK8s CRI 的实现;
  • PouchContainer 是由 alibaba 实现的 CRI
  • 其它的 CRI 实现,这里就不一一介绍了,更多详细信息自行查阅资料。
注意: Kubernetes 官方发布公告,宣布自 v1.20 起放弃对 Docker 的支持,届时用户将收到 Docker 弃用警告,并需要改用其他容器运行时。目前 k8s 最新版默认容器运行时是 CRI-containerd

3.1 安装 Docker

目前 Ubuntu 20.04 上没有 docker 官方提供的安装包,但是 Ubuntu 有,使用下面的命令来安装 Docker

1. apt 方式安装 docker

# 安装 Docker
$ sudo apt update && sudo apt install docker.io
 
# 启动 Docker,并设置为开机启动
$ sudo systemctl start docker && systemctl enable docker
注意: apt 方式安装 dockerdaemon.json 文件的位置在 /etc/docker/ 文件下面。

2. snap 方式安装 docker

# 安装 docker
$ sudo snap install docker
 
# 启动 docker
$ sudo snap start docker
注意: snap 方式安装 docker,daemon.json 文件的位置在 /var/snap/docker/*/config/ 文件下面。

参考:Ubuntu 20.04 以 snap 的方式安装 Docker,https://www.cnblogs.com/jijizhazha/p/13170711.html

​3.2 验证 Docker 是否安装成功

$ docker -v # 查看docker版本

image.png

3.3 配置 Docker 镜像下载加速器

$ cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
$ systemctl restart docker
$ docker info

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

3.4 在 Ubuntu 系统中配置阿里云 apt 软件源

#第一步:备份源文件:
$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
 
#第二步:编辑 `/etc/apt/sources.list` 文件
 
#在文件最前面添加以下条目(操作前请做好相应备份):
$ vi /etc/apt/sources.list
 
# 阿里云 apt 源
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
 
# 预发布软件源,不建议启用
#deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
 
#第三步:执行更新命令:
$ sudo apt-get update
$ sudo apt-get upgrade

其中 3.4 参考如下:

#1.查看 docker 服务是否开机启动
$ sudo systemctl list-unit-files | grep enable|grep docker
snap-docker-1125.mount                      enabled        
snap.docker.dockerd.service                enabled
 
#2.关闭 docker 开机自启动
$ systemctl disable snap.docker.dockerd.service
Removed /etc/systemd/system/multi-user.target.wants/snap.docker.dockerd.service.
 
#3.开启 docker 开机自启动
$ systemctl enable snap.docker.dockerd.service
 
#4.关闭 docker 服务
$ systemctl stop snap.docker.dockerd.service
 
#5.启动 docker 服务
$ systemctl start snap.docker.dockerd.service
 
#6.查看 docker 服务是否启动
$ sudo systemctl list-units --type=service|grep docker
snap.docker.dockerd.service  loaded active  running  Service for snap application docker.dockerd
注意:以上操作(除开2.4、2.5)均在所有节点执行;

开始安装 k8s

4.1 安装 K8s master

以下的操作只在 master 宿主机上执行,适合中国大陆地区使用(因为弃用谷歌的源和 repo,转而使用阿里云的镜像):

4.1.1 安装 kubelet、 kubeadm 和 kubectl

$ sudo apt update && sudo apt install -y ca-certificates curl software-properties-common apt-transport-https curl
$ curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
 
$ sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF 
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
 
$ sudo apt update
 
# 查看 kubeadm 可用版本
$ sudo apt-cache madison kubeadm
 
# 指定 kubeadm 版本安装
$ sudo apt install -y kubelet=1.22.1-00 kubeadm=1.22.1-00 kubectl=1.22.1-00
$ sudo apt-mark hold kubelet=1.22.1-00 kubeadm=1.22.1-00 kubectl=1.22.1-00
  • kubelet 运行在 Cluster 所有节点上,负责启动 Pod 和容器;
  • kubeadm 用于初始化 Cluster ;
  • kubectl 是 k8s 命令行工具,通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件;
注意:在所有节点均安装 kubelet、 kubeadm 和 kubectl。

4.1.2 初始化 Kubernetes Master

注意:这里使用了阿里云的镜像,然后使用了非默认的 CIDR(一定要和宿主机的局域网的 CIDR 不一样!)

=》4.1.2.1 命令初始化

$ kubeadm init \
  --apiserver-advertise-address=172.26.16.100 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.18.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all
 
# 或者 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers

命令参数说明:

  • 【--apiserver-advertise-address】集群通告地址;
  • 【--image-repository】由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址;
  • 【--kubernetes-version】K8s版本,与上面安装的一致;
  • 【--service-cidr】集群内部虚拟网络,Pod统一访问入口;
  • 【--pod-network-cidr】Pod网络与下面部署的 CNI 网络组件 yaml 中保持一致;
  • 【--ignore-preflight-errors】忽略预检查错误信息,这个参数会跳过对docker-ce的版本检查;

=》4.1.2.2 yaml 配置文件引导初始化

# 编辑配置文件
$ vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
imageRepository: registry.aliyuncs.com/google_containers 
networking:
  podSubnet: 10.244.0.0/16 
  serviceSubnet: 10.96.0.0/12 
 
#执行并应用配置文件
$ kubeadm init --config kubeadm.conf --ignore-preflight-errors=all  

4.2 加入 Kubernetes Node (部署 K8s worker 节点)

上面的命令执行成功后,会输出一条和 kubeadm join 相关的命令,后面加入 worker node 的时候要使用。

image.png

输出其他节点加入 master 的命令:

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/
 
Then you can join any number of worker nodes by running the following on each as root:
 
kubeadm join 192.168.0.168:6443 --token cm1xr0.frcfjgtg0q4we4z0 \
    --discovery-token-ca-cert-hash sha256:80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1

拷贝 kubectl 使用的连接k8s认证文件到默认路径,给自己的非 sudo 的常规身份拷贝一个 token,这样就可以执行 kubectl 命令了:

# 切换到非管理员账户
$ su chait 
 
# 最后拷贝 kubectl 工具用的 kubeconfig 到默认路径下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
 
# 查看集群节点信息
$ kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   2m   v1.18.0

在每个 node/worker 宿主机上,执行上面初始化 master 最后输出的命令,如下所示:

kubeadm join 192.168.0.168:6443 --token cm1xr0.frcfjgtg0q4we4z0 \
    --discovery-token-ca-cert-hash sha256:80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1

接下来在 node/worker 节点输入命令=》【kubectl get pods】,结果出现如下错误:

image.png

The connection to the server localhost:8080 was refused - did you specify the right host or port?

出现这个问题的原因是 kubectl 命令需要使用 kubernetes-admin 来运行,解决方法如下,将 Master 节点中的【/etc/kubernetes/admin.conf】文件拷贝到 worker 节点相同目录下,然后配置环境变量:

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile # 立即生效

再次输入命令【kubectl get pods --all-namespaces】查看所有 pod 的命名空间,显示如下:

image.png

默认 token 有效期为 24 小时,当过期之后,该 token 就不可用了。这时就需要重新创建 token,操作如下:

$ kubeadm token create
$ kubeadm token list
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1
 
$ kubeadm join 192.168.31.61:6443 --token nuja6n.o3jrhsffiqs9swnu --discovery-token-ca-cert-hash sha256:80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1

命令:kubeadm token create --print-join-command

参考地址 =》https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/

4.3 部署容器网络(CNI)

  • Calico 是一个纯三层的数据中心网络方案,Calico 支持广泛的平台,包括 Kubernetes、OpenStack 等。
  • Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器(vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。
  • 此外,Calico 项目还实现了 Kubernetes 网络策略,提供 ACL 功能。

=》 Quickstart for Calico on Kuberneteshttps://docs.projectcalico.org/getting-started/kubernetes/quickstart

4.3.1 安装 calico 插件

下载 calicok8s yaml 文件

# 下载 https://docs.projectcalico.org/v3.11/manifests/calico.yaml
sudo wget https://docs.projectcalico.org/v3.11/manifests/calico.yaml
# 修改CALICO_IPV4POOL_CIDR
root@k8s-master01:/# vim calico.yaml
# 通过文件名或控制台输入,对资源进行配置。
root@k8s-master01:/# kubectl apply -f calico.yaml

image.png

下载完后还需要修改里面配置项:

  • 定义 Pod 网络(CALICO_IPV4POOL_CIDR),与前面 pod CIDR 配置一样;
  • 选择工作模式(CALICO_IPV4POOL_IPIP),支持 BGP(Never)、IPIP(Always)、CrossSubnet(开启 BGP 并支持跨子网);

修改里面的 CALICO_IPV4POOL_CIDR 的值来避免和宿主机所在的局域网段冲突(把原始的192.168.0.0/16 修改成了 172.16.0.0/16):

修改完后应用清单:

image.png

image.png

等待所有的 podready 就绪。

4.4 测试 K8s 集群环境

  • 验证Pod工作;
  • 验证Pod网络通信;
  • 验证DNS解析;

Kubernetes 集群中创建一个 pod,验证是否正常运行:

$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pod,svc

访问地址:http://NodeIP:Port

4.5 部署 K8s dashboard

kubernetes/dashboard =》 https://github.com/kubernetes/dashboard

执行命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml

以上方式启动 dashboard 访问会不太方便,只能在集群内部(cluster-ip)访问,可修改 yaml 中的 service 暴露端口方式为 NodePort 类型,即可直接在浏览器中访问;

$ vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 17030
      targetPort: 8443
  type: NodePort
  externalIPs:
    - 192.168.0.168
  selector:
    k8s-app: kubernetes-dashboard
...
$ kubectl apply -f recommended.yaml
$ kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-6b4884c9d5-gl8nr   1/1     Running   0          13m
kubernetes-dashboard-7f99b75bf4-89cds        1/1     Running   0          13m

执行上面命令可能出现网络原因访问不起,可以 github 直接下载相应 yaml 文件设置;

image.png

在需要部署的节点中安装文件传输工具:

$ sudo apt install lrzsz # 安装 rz 工具
$ rz # 选择上传的文件

image.png

此时查看当前列表=》【ls】

image.png

此处 dashboard 本人是安装在 master 节点,安装信息如下:

image.png

访问地址:https://NodeIP:30001

创建 service account 并绑定默认 cluster-admin 管理员集群角色:

# 创建用户
$ kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
$ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户Token
$ kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

使用输出的 token 登录 Dashboard

4.6 安装 Ingress

此处我们使用 NGINX ingress controller 方式安装,更多的安装方式查看=》(Ingress Controllers | Kubernetes,https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) ;

K8s 官方支持和维护的是 GCENGINX 两种 Controller,执行如下命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/baremetal/deploy.yaml

上面方式可能存在网络访问失败的情况,此处安装的是【ingress-nginx】版本【v0.30.0】,ingress-controller.yaml 文件已经下载好,rz 上传到 worker 节点,如下所示:

image.png

最后我们来查看下 1 Master 架构的 3 node 集群情况, 显示信息如下:

image.png

4.7 访问 Dashboard

4.7.1 使用 kubectl proxy

image.png

启动成功后,可在内网节点的浏览器中访问 =》

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

vmware 虚拟化节点访问 =》

curl http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

4.7.2 使用 API Server

如果 Kubernetes API 服务器是公开的并且可从外部访问,就可以用 API Server 来访问 =》

https://<master-ip>:<apiserver-port>/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

查看 yaml 文件对应的镜像版本

cat  kubernetes-dashboard.yaml|grep kubernetes-dashboard

4.7.3 两种登录模式 KubeconfigToken

image.png

此处我使用的是 Token 方式登陆,获取 Token =》 输入以下命令来创建用户 token,利用 token 来登录 dashboard

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

image.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
5天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
21 2
|
17天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
1月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
74 1
|
2月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
2月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
2月前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
147 17
|
2月前
|
Kubernetes Ubuntu Linux
Centos7 搭建 kubernetes集群
本文介绍了如何搭建一个三节点的Kubernetes集群,包括一个主节点和两个工作节点。各节点运行CentOS 7系统,最低配置为2核CPU、2GB内存和15GB硬盘。详细步骤包括环境配置、安装Docker、关闭防火墙和SELinux、禁用交换分区、安装kubeadm、kubelet、kubectl,以及初始化Kubernetes集群和安装网络插件Calico或Flannel。
211 4
|
2月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
991 1
|
2月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
93 3