01-kubeadm安装高可用Kubernetes集群
1、环境规划
1.1 网段规划
-
Pod网段:
10.244.0.0/16
-
Service网段:
10.10.0.0/16
1.2 服务器规划
- 操作系统:CentOS7.x
- 内存:4Gb
- CPU:4核CPU
- 硬盘:100Gb
- 虚拟化:开启
Kubernetes集群角色 | IP | 主机名 | 安装的组件 |
---|---|---|---|
控制节点(Master节点) | 192.168.126.10 | k8s-master01.staryjie.com | API Server Controller-manager Scheduler kubelet etcd docker kube-proxy keepalived nginx calico |
控制节点(Master节点) | 192.168.126.11 | k8s-master02.staryjie.com | API Server Controller-manager Scheduler kubelet etcd docker kube-proxy keepalived nginx calico |
工作节点(Node节点) | 192.168.126.20 | k8s-node01.staryjie.com | kubelet kube-proxy docker calico coredns |
工作节点(Node节点) | 192.168.126.21 | k8s-node02.staryjie.com | kubelet kube-proxy docker calico coredns |
VIP | 192.168.126.8 |
2、初始化服务器
2.1 配置IP和主机名
2.1.1 服务器IP改成静态IP
静态IP可以保证服务器IP不会发生改变,保证环境不会发生改变。
一般云服务器都会有固定公网IP,如果是虚拟机等,可以通过配置静态IP来实现。
例:
cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet BOOTPROTO=static NAME=eth0 DEVICE=eth0 ONBOOT=yes IPADDR=192.168.126.10 NETMASK=225.225.225.0 GATEWAY=192.168.126.2 DNS1=223.5.5.5 DNS2=8.8.8.8
修改后,需要重启网络服务:
systemctl restart network.service
2.1.2 设置主机名
hostnamectl set-hostname k8s-master01.staryjie.com
hostnamectl set-hostname k8s-master02.staryjie.com
hostnamectl set-hostname k8s-node01.staryjie.com
hostnamectl set-hostname k8s-node02.staryjie.com
设置主机名之后,需要重新登陆,或者执行
bash
命令使其生效。
2.1.3 配置hosts文件
cat >> /etc/hosts << EOF
192.168.126.10 k8s-master01.staryjie.com
192.168.126.11 k8s-master02.staryjie.com
192.168.126.20 k8s-node01.staryjie.com
192.168.126.21 k8s-node02.staryjie.com
EOF
Kubernetes集群中每一台主机都需要配置。
2.1.4 配置免密钥登陆
# 生成sshkey
ssh-keygen
# ssh-copyid分发sshkey
ssh-copy-id root@k8s-master01.staryjie.com
ssh-copy-id root@k8s-master02.staryjie.com
ssh-copy-id root@k8s-node01.staryjie.com
ssh-copy-id root@k8s-node02.staryjie.com
2.1.5 时间同步
yum install -y chrony
systemctl restart chronyd.service
systemctl enable chronyd.service
2.1.6 关闭交换分区
# 临时关闭
swapoff -a
# 永久关闭
vim /etc/fstab
# 注释swap分区
关闭交换分区,直接使用内存,可以提升效率。在使用kubeadm初始化Kubernetes集群时,如果没有关闭swap分区,会报错,如果想要不关闭swap分区安装Kubernetes集群,在kubeadm init的时候需要加上参数:
--ignore-preflight-errors=Swap
来解决。
2.1.7 修改内核参数
# 加载模块
modprobe br_netfilter
# 添加内核参数配置
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 使内核参数生效
sysctl -p /etc/sysctl.d/k8s.conf
2.2 配置防火墙和yum源
2.2.1 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
2.2.2 关闭SELINUX
# 临时关闭
setenforce 0
# 永久关闭
sed -i.bak "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux/config
reboot # 重启生效
2.2.3 配置yum源
# 备份yum源
mkdir -p /root/repo.bak/
cd /etc/yum.repos.d
mv ./* /root/repo.bak/
# 更换为阿里云的CentOS7 yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
# 更换阿里云的epel 源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 添加阿里云docker-ce源
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 添加阿里云Kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 生成缓存
yum makecache fast
2.3 配置ipvs
Kubernetes组件kube-proxy支持iptables和ipvs两种模式。ipvs的支持是从Kubernetes1.8的时候开始支持的。在Kubernetes1.11版本稳定。
iptables和ipvs都是基于内核的netfilter
模块实现的。
ipvs采用的是hash表存储规则,查询速度会很快。
iptables查询需要全量扫描规则表,当规则比较多的时候,查询效率比较低。
- ipvs为大型集群提供了更好的可扩展性和性能
- ipvs支持比iptables更复杂的负载均衡算法(最小负载、最少连接、加权等等)
- ipvs支持服务健康检查和连接重试等功能
2.3.1 开启ipvs
cat > /etc/sysconfig/modules/ipvs.modules << "EOF"
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules}; do
/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
if [ 0 -eq 0 ]; then
/sbin/modprobe ${kernel_module}
fi
done
EOF
# 给予可执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
2.3.2 安装基础软件包
yum install -y wget net-tools yum-utils device-mapper-persistent-data nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip ntp libaio-devel vim ncurses-devel autoconf automake zlib-devel python-devel epel-release socat ipvsadm conntrack tree
2.4 安装Iptables
因为Kubernetes的kube-proxy默认使用的是iptables,所以先提前安装一下iptablse:
yum install -y iptables-services
systemctl stop iptables.service
systemctl disable iptables.service
iptables -F
2.5 安装和配置Docker
2.5.1 安装Docker
yum install -y docker-ce-20.10.6-3.el7 docker-ce-cli-20.10.6-3.el7 containerd.io
systemctl start docker.service
systemctl enable docker.service
systemctl status docker.service
2.5.2 配置加速仓库
mkdir /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://rrr9h8xt.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 重启docker
systemctl daemon-reload
systemctl restart docker.service
systemctl status docker.service
3、高可用Kubernetes集群安装
3.1 安装初始化Kubernetes集群的软件包
-
kubeadm:Kubernetes官方安装Kubernetes工具,kubeadm init 、kubeadm join
-
kubelet:启动、删除Pod的工具
-
kubectl:操作Kubernetes资源的工具,创建、删除、修改资源等,控制节点安装即可。
yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6
# kubelet必须设置开机自启
systemctl start kubelet.service
systemctl enable kubelet.service
systemctl status kubelet.service
在Kubernetes集群没有初始化完成之前,kubelet是无法正常启动的,会一直处于
auto-restart
状态。直到Kubernetes集群的组件全部正常启动才会显示running
状态。
3.2 配置keepalived和Nginx实现高可用Kubernetes集群
Kubernetes集群Master节点的高可用主要在API Server
的高可用,并且我们直到API Server
使用的是6443
端口,所以我们可以提前将Keeepalived和Nginx使API Server
高可用的环境搭建出来。
这里复用了两台Master节点,所以该配置都在两台Master节点,如果服务器足够,也可以将Nginx单独出来。
3.2.1 安装Nginx和Keepalived
# 需要安装epel源,前面配置yum源的时候已经安装了
yum install -y nginx keepalived
yum -y install nginx-all-modules.noarch # 配置文件中的stream可能不能被识别,需要安装这个
3.2.2 配置主备节点Nginx配置
主备节点Nginx配置文件一致:
# 两台负载均衡服务器上的Nginx配置文件一致
cat > /etc/nginx/nginx.conf << "EOF"
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
# 四层负载均衡,为两台Master apiserver组件提供负载均衡
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
access_log /var/log/nginx/k8s-access.log main;
upstream k8s-apiserver {
server 192.168.126.10:6443; # Master1 APISERVER IP:PORT
server 192.168.126.11:6443; # Master2 APISERVER IP:PORT
}
server {
listen 16443; # 由于Nginx和ApiServer在同一台主机,所以这里不能使用6443端口,否则会冲突
proxy_pass k8s-apiserver;
}
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80 default_server;
server_name _;
location / {
}
}
}
EOF
3.2.3 Keepalived配置
主节点keepalived配置:
# Nginx Master节点上的配置
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
priority 100 # 优先级,备服务器设置 90
advert_int 1 # 指定VRRP 心跳包通告间隔时间,默认1秒
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP
virtual_ipaddress {
192.168.126.8/24
}
track_script {
check_nginx
}
}
EOF
备节点keepalived配置:
# Nginx Backup节点上的配置
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_BACKUP
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.126.8/24
}
track_script {
check_nginx
}
}
EOF
- vrrp_script:指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移)
- virtual_ipaddress:虚拟IP(VIP)
3.2.4 keepalived检查脚本
# 两台负载均衡服务器上都要编写这个脚本
cat > /etc/keepalived/check_nginx.sh << "EOF"
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
exit 1
else
exit 0
fi
EOF
chmod +x /etc/keepalived/check_nginx.sh
说明:keepalived根据脚本返回状态码(0为工作正常,非0不正常)判断是否故障转移。
3.2.5 启动Nginx和keepalived
systemctl daemon-reload
systemctl start nginx.service
systemctl start keepalived.service
systemctl enable nginx.service
systemctl enable keepalived.service
3.2.6 检查keepalived工作状态
ip a
此时,
192.168.126.8
这个vip已经绑定在k8s-master01.staryjie.com
这台主机上,说明keepalived工作正常。
3.2.7 测试VIP漂移
关闭主节点Nginx,测试VIP是否漂移到备节点服务器。
# 主节点上关闭nginx
systemctl stop nginx.service
此时VIP在备节点上:
如果主机点上的Nginx重新启动,VIP会再次会到主节点:
VIP漂移需要一定的时间(一秒钟左右),在VIP漂移的过程中,服务可能会中断一会儿。
3.3 kubeadm初始化Kubernetes集群
3.3.1 生成kubeadm初始化Kubernetes集群配置文件
kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.20.6
controlPlaneEndpoint: 192.168.126.8:16443
imageRepository: registry.aliyuncs.com/google_containers
apiServer:
certSANs:
- 192.168.126.8
- 192.168.126.10
- 192.168.126.11
- 192.168.126.20
- 192.168.126.21
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.10.0.0/16
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
Kind: KubeProxyConfiguration
mode: ipvs
3.3.2 初始化Kubernetes集群
kubeadm init --config kubeadm-config.yaml
初始化过程如下:
Kubernetes集群的Master节点初始化成功!
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 如果是root用户,可以直接执行下面的命令
cat >> /etc/profile << EOF
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
添加控制节点的命令:
kubeadm join 192.168.126.8:16443 --token xb3oqo.7cahevx14botb50r \
--discovery-token-ca-cert-hash sha256:936620d5322d3850288a00f4fe1e7514ec79de9c94ab8725fa60c784aa6b2c69 \
--control-plane
添加工作节点的命令:
kubeadm join 192.168.126.8:16443 --token xb3oqo.7cahevx14botb50r \
--discovery-token-ca-cert-hash sha256:936620d5322d3850288a00f4fe1e7514ec79de9c94ab8725fa60c784aa6b2c69
3.3.3 kubeadm init流程
3.4 Kubernetes集群添加Master节点
3.4.1 拷贝控制节点已经生成的证书
# 在k8s-master02.staryjie.com上创建目录
mkdir -p /etc/kubernetes/pki/etcd/
mkdir -p ~/.kube/
拷贝证书:
# 在k8s-master01.staryjie.com主机上操作
scp /etc/kubernetes/pki/ca.crt root@k8s-master02.staryjie.com:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/ca.key root@k8s-master02.staryjie.com:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/sa.key root@k8s-master02.staryjie.com:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/sa.pub root@k8s-master02.staryjie.com:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/front-proxy-ca.crt root@k8s-master02.staryjie.com:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/front-proxy-ca.key root@k8s-master02.staryjie.com:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/etcd/ca.crt root@k8s-master02.staryjie.com:/etc/kubernetes/pki/etcd/
scp /etc/kubernetes/pki/etcd/ca.key root@k8s-master02.staryjie.com:/etc/kubernetes/pki/etcd/
3.4.2 添加控制节点
根据初始化集群后的提示命令加入到集群中:
kubeadm join 192.168.126.8:16443 --token xb3oqo.7cahevx14botb50r \
--discovery-token-ca-cert-hash sha256:936620d5322d3850288a00f4fe1e7514ec79de9c94ab8725fa60c784aa6b2c69 \
--control-plane
加入过程如下:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果忘记加入集群的token或者token过期了,可以执行下面的命令:
# 获取加入集群的token和命令
kubeadm token create --print-join-command
加入控制节点的时候,需要在上面生成的命令后面加上
--control-plane
。
3.4.3 kubectl命令自定补全
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
3.4.4 kubeadm join流程
3.5 Kubernetes集群添加Node节点
根据Kubernetes初始化时候的提示,直接在工作节点上执行:
kubeadm join 192.168.126.8:16443 --token xb3oqo.7cahevx14botb50r \
--discovery-token-ca-cert-hash sha256:936620d5322d3850288a00f4fe1e7514ec79de9c94ab8725fa60c784aa6b2c69
成功加入Kubernetes集群:
在控制节点上执行kubectl get nodes
:
工作节点上的ROLES显示为none
,如果要让他显示为worker
,则可以执行下面的命令:
kubectl label node k8s-node01.staryjie.com node-role.kubernetes.io/worker=worker
kubectl label node k8s-node02.staryjie.com node-role.kubernetes.io/worker=worker
然后再次查看:
此时查看Kubernetes组件信息:
kubectl get pods -n kube-system -o wide
此时,coredns
处于Pending
状态,是由于网络插件没有安装导致的。
3.6 安装calico网络插件
官方文档:https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart
3.6.1 获取calico资源文件
wget http://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/hosted/calico.yaml
3.6.2 安装calico
kubectl apply -f calico.yaml
安装过程:
3.6.3 检查安装结果
kubectl get pods -n kube-system -o wide
此时coredns
的状态变成Running
:
kubectl get nodes
所有节点的状态也变成了Ready
:
3.7 测试Kubernetes集群网络是否正常
通过创建一个Pod来测试:
kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
能够正常访问网络:
3.8 测试Kubernetes集群部署Pod
tomcat.yaml
:
apiVersion: v1 #pod属于k8s核心组v1
kind: Pod #创建的是一个Pod资源
metadata: #元数据
name: demo-pod #pod名字
namespace: default #pod所属的名称空间
labels:
app: myapp #pod具有的标签
env: dev #pod具有的标签
spec:
containers: #定义一个容器,容器是对象列表,下面可以有多个name
- name: tomcat-pod-java #容器的名字
ports:
- containerPort: 8080
image: tomcat:8.5-jre8-alpine #容器使用的镜像
imagePullPolicy: IfNotPresent
kubectl apply -f tomcat.yaml
此时Kubernetes集群内部可以正常访问到Tomcat
服务:
为了能够在集群外部也能访问,我们需要在Pod
前面加一个Service
:
tomcat-service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: tomcat
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30080
selector:
app: myapp
env: dev
kubectl apply -f tomcat-service.yaml
部署了一个名为tomcat
的Service:
因为Service的类型是NodePort,所以我们可以通过节点IP加端口访问:
3.9 测试CoreDNS域名解析
kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
# 测试域名解析
/ # nslookup kubernetes.default.svc.cluster.local
Server: 10.10.0.10 # kube-dns的地址(coredns服务)
Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default.svc.cluster.local
Address 1: 10.10.0.1 kubernetes.default.svc.cluster.local # Service kubernetes 的地址
/ #
/ # nslookup tomcat.default.svc.cluster.local
Server: 10.10.0.10
Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local
Name: tomcat.default.svc.cluster.local
Address 1: 10.10.198.59 tomcat.default.svc.cluster.local # Service tomcat 的地址
/ #
/ # nslookup kube-dns.kube-system.svc.cluster.local
Server: 10.10.0.10
Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local
Name: kube-dns.kube-system.svc.cluster.local
Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local
/ #
4、安装Dashboard
官方文档:https://github.com/kubernetes/dashboard
4.1 根据资源清单安装dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
具体安装什么版本需要参考官方文档,看哪一个版本能够兼容当前的Kubernetes版本。
安装之后,Kubernetes会将dashboard的Pod运行在kubernetes-dashboard
的命名空间下:
kubectl get pods -n kubernetes-dashboard -o wide
dashboard的Service也在kubernetes-dashboard
命名空间:
kubectl get svc -n kubernetes-dashboard -o wide
4.2 修改dashboard的Service类型
由于ClusterIP
类型的Service无法在集群外部访问,所以我们需要将kubernetes-dashboard
这个Service的类型改为NodePort
:
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
将下图中的ClusterIP
改为NodePort
保存退出即可:
保存之后:
4.3 外部访问dashboard
这时候,我们就可以在Kubernetes集群外部访问到Dashboard了:
由于dashboard的ssl证书是Kubernetes自动生成的,所以很多浏览器不信任,可以选择FireFox
浏览器访问,按照上图的方法即可正常访问:这样就进入了dashboard的登陆界面。
4.4 通过token令牌访问dashboard
创建管理员token,具有查看任何命名空间的权限,可以管理所有的资源对象:
kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kubernetes-dashboard
创建完成之后,查看kubernetes-dashboard
命名空间下的secrets
:
# 查看kubernetes-dashboard命名空间下的所有secrets
kubectl get secrets -n kubernetes-dashboard
# 查看token
kubectl describe secret kubernetes-dashboard-token-nq6hm -n kubernetes-dashboard
如下图,复制token
部分的内容,在浏览器粘贴即可登陆:
也可以使用下面的命令获取到Token:
kubectl describe secrets $(kubectl get secrets -n kubernetes-dashboard | grep kubernetes-dashboard-token|awk '{print $1}') -n kubernetes-dashboard | awk 'NR==13{print $2}'
回到浏览器,选择通过token登陆,粘贴token:点击登陆之后,成功登陆:
4.5 通过Kubeconfig登陆
在dashboard登陆界面, token
和Kubeconfig
两种登陆方式。上面已经详细说明了怎么通过token登陆,所以这里说明一下怎么通过Kubeconfig登陆。
4.5.1 创建cluster集群
cd /etc/kubernetes/pki/
kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://192.168.126.8:16443" --embed-certs=true --kubeconfig=/root/dashboard-admin.conf
# 查看ashboard-admin.conf
cat /root/dashboard-admin.conf
4.5.2 创建credentials
创建credentials需要使用通过token登陆时生成的token信息。
# 获取token并赋值给环境变量
DEF_NS_ADMIN=$(kubectl get secret kubernetes-dashboard-token-nq6hm -n kubernetes-dashboard -o jsonpath={.data.token}|base64 -d)
# 查看环境变量(token)
echo $DEF_NS_ADMIN
# 通过token创建credentials
kubectl config set-credentials dashboard-admin --token=$DEF_NS_ADMIN --kubeconfig=/root/dashboard-admin.conf
# 查看Kubeconfig文件dashboard-admin.conf
cat /root/dashboard-admin.conf
4.5.3 创建context
kubectl config set-context dashboard-admin@kubernetes --cluster=kubernetes --user=dashboard-admin --kubeconfig=/root/dashboard-admin.conf
# 查看Kubeconfig文件dashboard-admin.conf
cat /root/dashboard-admin.conf
4.5.4 切换当前context为dashboard-admin@kubernetes
kubectl config use-context dashboard-admin@kubernetes --kubeconfig=/root/dashboard-admin.conf
# 查看Kubeconfig文件dashboard-admin.conf
cat /root/dashboard-admin.conf
4.5.5 通过Kubeconfig登陆
将生成的dashboard-admin.conf
复制到本地,登陆也没选择通过Kubeconfig
登陆,并选择dashboard-admin.conf
进行登陆:
点击登录后,成功登陆dashboard:
4.6 通过Dashboard创建应用
在dashboard的右上角点击+
号,选择从表单创建
:
根据表单选项填写:
点击部署
即可完成Pod的创建:
通过Service
可以查看到对应的Service
:
通过dashboard创建的Service默认是LoadBalance类型,但是在这种情况下,没有集成
LoadBalancer
(与 AWS、Google Cloud、阿里云等云厂商不同)。使用此默认设置,你只能使用NodePort
或Ingress Controller
。但是不影响你提供节点IP加端口访问,或者你也可以直接
kubectl edit svc xxx
将类型修改为NodePort
即可。
通过节点IP:31272访问:
可以正常访问,说明Nginx部署成功了。
5、安装metrics-server组件
metrics-server
5.1 什么是metrics-server
是一个集群范围内的资源数据集和工具,同样的,metrics-server
也只是显示数据,并不提供数据存储服务,主要关注的是资源度量API的实现,比如CPU、文件描述符、内存、请求延时等指标,metrics-server
收集数据给Kubernetes集群内使用,如kubectl
,hpa
,scheduler
等。
可以通过kubectl top
等获取Kubernetes集群中资源信息等。
- Kubernetes Metrics Server 是 Cluster 的核心监控数据的聚合器,kubeadm 默认是不部署的。
- Metrics Server 供 Dashboard 等其他组件使用,是一个扩展的 APIServer,依赖于 API Aggregator。所以,在安装 Metrics Server 之前需要先在 kube-apiserver 中开启 API Aggregator。
- Metrics API 只可以查询当前的度量数据,并不保存历史数据。
- Metrics API URI 为 /apis/metrics.k8s.io/,在 k8s.io/metrics 下维护。
- 必须部署 metrics-server 才能使用该 API,metrics-server 通过调用 kubelet Summary API 获取数据。
GitHub地址:https://github.com/kubernetes-sigs/metrics-server
下载地址:https://github.com/kubernetes-sigs/metrics-server/releases
5.2 安装条件
注意:使用 Metrics Server 有必备两个条件:
-
API Server 启用 Aggregator Routing 支持。否则 API Server 不识别请求:
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get pods.metrics.k8s.io)
-
API Server 能访问 Metrics Server Pod IP。否则 API Server 无法访问 Metrics Server:
E1223 07:23:04.330206 1 available_controller.go:420] v1beta1.metrics.k8s.io failed with: failing or missing response from https://192.168.126.8:14443/apis/metrics.k8s.io/v1beta1: Get https://192.168.126.8:14443/apis/metrics.k8s.io/v1beta1: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
5.3 修改API Server配置
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 添加如下一行
- --enable-aggregator-routing=true
修改的内容如下:
注意:这个是k8s在1.17的新特性,如果是1.16版本的可以不用添加,1.17以后要添加。这个参数的作用是Aggregation允许在不修改Kubernetes核心代码的同时扩展Kubernetes API。
保存退出之后,需要更新API Server配置才能够生效:
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
kubectl get pods -n kube-system -o wide
将下面图中状态为CrashLoopBackOff
的Pod删除:
kubectl delete pod kube-apiserver -n kube-system
删除之后Kubernetes会自动拉起新的Pod:
5.4 安装metrics-server
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
mv components.yaml metrics.yaml
kubectl apply -f metrics.yaml
kubectl get pods -n kube-system -o wideku
安装之后:
5.4 测试kubectl top命令
# 查看kube-system命名空间中Pod的资源占用情况
kubectl top pods -n kube-system
kube-system
命名空间Pod资源使用情况:
# 查看节点资源使用情况
kubectl top nodes
Kubernetes节点资源使用情况:
scheduler
、controller-manager
和kube-proxy
监听地址
6、修改默认scheduler
、controller-manager
组件监听端口是在127.0.0.1
上的:
后期如果提供Prometheus
监控这些组件的时候,无法获取到127.0.0.1
上的数据,所以我们需要将这些端口的监听地址修改为物理机的网卡IP上。
6.1 修改scheduler组件的监听地址
vim /etc/kubernetes/manifests/kube-scheduler.yaml
需要将下图中四个部分进行修改:
- 将
- --bind-address=127.0.0.1
修改为实际的主机IP - 删除
- --port=0
- 将
livenessProbe
下httpGet
中的host: 127.0.0.1
修改为实际的主机IP - 将
startupProbe
下httpGet
中的host: 127.0.0.1
修改为实际的主机IP
修改后如下图所示:
保存退出后,需要重启所有节点(所有master节点和worker节点)上的kubelet
修改就会生效:
systemctl restart kubelet.service
修改后再次查看监听端口:
6.2 修改controller-manager组件监听地址
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
将下图中四个部分进行修改:
- 将
- --bind-address=127.0.0.1
修改为实际的主机IP - 删除
- --port=0
- 将
livenessProbe
下httpGet
中的host: 127.0.0.1
修改为实际的主机IP - 将
startupProbe
下httpGet
中的host: 127.0.0.1
修改为实际的主机IP
修改为下图所示:
保存退出后,需要重启所有节点(所有master节点和worker节点)上的kubelet
修改就会生效:
systemctl restart kubelet.service
修改后再次查看监听端口:
6.3 修改Kube-proxy组件的监听地址
kubectl edit configmaps -n kube-system kube-proxy
将下图中对应的metricsBindAddress
修改为0.0.0.0:10249
:
修改之后的内容如下图所示:
修改完成之后,保存退出,并且需要重启kube-proxy对应的Pod:
kubectl get pods -n kube-system | grep kube-proxy |awk '{print $1}' | xargs kubectl delete pods -n kube-system
重启完之后查看监听地址:
6.4 检查
netstat -lntp | grep :10249
netstat -lntp | grep :10251
netstat -lntp | grep :10252
最终效果如下:
7、重置节点
# 重置主节点(k8s-master01)
kubeadm reset
rm -rf /root/.kube/
rm -rf /etc/kubernetes/
systemctl restart kubelet.service
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了