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

image-20220302135937917

此时,192.168.126.8这个vip已经绑定在k8s-master01.staryjie.com这台主机上,说明keepalived工作正常。

3.2.7 测试VIP漂移

关闭主节点Nginx,测试VIP是否漂移到备节点服务器。

# 主节点上关闭nginx
systemctl stop nginx.service

image-20220302140242350

此时VIP在备节点上:image-20220302140326187

如果主机点上的Nginx重新启动,VIP会再次会到主节点:image-20220302140508646

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

初始化过程如下:image-20220302150953567image-20220302151248014

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流程

img

3.4 Kubernetes集群添加Master节点

3.4.1 拷贝控制节点已经生成的证书

# 在k8s-master02.staryjie.com上创建目录
mkdir -p /etc/kubernetes/pki/etcd/
mkdir -p ~/.kube/

image-20220302152401754

拷贝证书:

# 在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

加入过程如下:image-20220302153342633image-20220302153442024

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流程

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集群:image-20220302153807383

在控制节点上执行kubectl get nodes:![image-20220302153957665](/Users/staryjie/Library/Application Support/typora-user-images/image-20220302153957665.png)

工作节点上的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

然后再次查看:image-20220302154239420

此时查看Kubernetes组件信息:

kubectl get pods -n kube-system -o wide

image-20220302154443931

此时,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

安装过程:image-20220302160030309

3.6.3 检查安装结果

kubectl get pods -n kube-system -o wide

此时coredns的状态变成Runningimage-20220302160150755

kubectl get nodes

所有节点的状态也变成了Readyimage-20220302160229175

3.7 测试Kubernetes集群网络是否正常

通过创建一个Pod来测试:

kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh

能够正常访问网络:image-20220302160728943

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服务:image-20220302161652142

为了能够在集群外部也能访问,我们需要在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:image-20220302162052629

因为Service的类型是NodePort,所以我们可以通过节点IP加端口访问:image-20220302162246564

image-20220302162406260

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

image-20220303095120512

dashboard的Service也在kubernetes-dashboard命名空间:

kubectl get svc -n kubernetes-dashboard -o wide

image-20220303095224499

4.2 修改dashboard的Service类型

由于ClusterIP类型的Service无法在集群外部访问,所以我们需要将kubernetes-dashboard这个Service的类型改为NodePort

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

将下图中的ClusterIP改为NodePort保存退出即可:image-20220303095505132

保存之后:image-20220303095755152

4.3 外部访问dashboard

这时候,我们就可以在Kubernetes集群外部访问到Dashboard了:image-20220303100115086

由于dashboard的ssl证书是Kubernetes自动生成的,所以很多浏览器不信任,可以选择FireFox浏览器访问,按照上图的方法即可正常访问:image-20220303100257002这样就进入了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部分的内容,在浏览器粘贴即可登陆:image-20220303101333777

也可以使用下面的命令获取到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:image-20220303101436815点击登陆之后,成功登陆:image-20220303101538618

4.5 通过Kubeconfig登陆

在dashboard登陆界面, tokenKubeconfig两种登陆方式。上面已经详细说明了怎么通过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

image-20220303102157667

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

image-20220303102726046

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

image-20220303103231277

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

image-20220303103503670

4.5.5 通过Kubeconfig登陆

将生成的dashboard-admin.conf复制到本地,登陆也没选择通过Kubeconfig登陆,并选择dashboard-admin.conf进行登陆:image-20220303103951872

点击登录后,成功登陆dashboard:image-20220303104026401

4.6 通过Dashboard创建应用

在dashboard的右上角点击+号,选择从表单创建image-20220303104421847

根据表单选项填写:image-20220303104620222

点击部署即可完成Pod的创建:image-20220303104836273

通过Service可以查看到对应的Serviceimage-20220303105033693

通过dashboard创建的Service默认是LoadBalance类型,但是在这种情况下,没有集成 LoadBalancer(与 AWS、Google Cloud、阿里云等云厂商不同)。使用此默认设置,你只能使用 NodePortIngress Controller

但是不影响你提供节点IP加端口访问,或者你也可以直接kubectl edit svc xxx将类型修改为NodePort即可。

通过节点IP:31272访问:image-20220303105149028

可以正常访问,说明Nginx部署成功了。

5、安装metrics-server组件

5.1 什么是metrics-server

metrics-server是一个集群范围内的资源数据集和工具,同样的,metrics-server也只是显示数据,并不提供数据存储服务,主要关注的是资源度量API的实现,比如CPU、文件描述符、内存、请求延时等指标,metrics-server收集数据给Kubernetes集群内使用,如kubectlhpascheduler等。

可以通过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 有必备两个条件:

  1. API Server 启用 Aggregator Routing 支持。否则 API Server 不识别请求:

    Error from server (ServiceUnavailable): the server is currently unable to handle the request (get pods.metrics.k8s.io)
    
  2. 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节点资源使用情况:

6、修改schedulercontroller-managerkube-proxy监听地址

默认schedulercontroller-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
  • livenessProbehttpGet中的host: 127.0.0.1修改为实际的主机IP
  • startupProbehttpGet中的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
  • livenessProbehttpGet中的host: 127.0.0.1修改为实际的主机IP
  • startupProbehttpGet中的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
posted @ 2022-05-17 22:31  StaryJie  阅读(255)  评论(0编辑  收藏  举报