Windows10 64位,
vmware workstation pro 16、
CentOS-7-x86_64-Everything-2009.iso
台式机资源不够,只能开启三台虚拟机,我把它全部当作master节点,如果资源够,可以开启3台master 2台node
主机名 | IP地址 | 说明 |
---|---|---|
k8smaster1 ~ 3 | 192.168.3.100 ~ 102 | master节点 * 3 |
k8smaster-lb(不需要设置单独的ip) | 192.168.3.100 | keepalived虚拟IP |
配置信息 | 备注 |
---|---|
系统版本 | CentOS 7.9 |
Docker版本 | 20.10.x |
Pod网段 | 172.16.0.0/12 |
Service网段 | 10.96.0.0/16 |
宿主机网段、K8s Service网段、Pod网段不能重复,具体可以参考这儿
详解IP地址后面斜杠加具体数字
我是官网下载vmware workstation pro 16,然后可以淘宝购买激活码或者网上搜
安装好之后,创建虚拟机
磁盘20G已经够用
网络家庭内部(连接相同wifi)使用桥接网络,删掉声卡,打印机设备
以上我们已经动态获取了虚拟机的IP,但动态IP可能会随着虚拟机的重启而发生变化,特别是存在多台虚拟机都动态获取IP时,不太利于我们的开发和测试,因此,统一配置静态IP是有必要的。
第一步:设置VMware虚拟机的网关。
更改设置-》VMnet0(选择宿主机上网的网卡)-》桥接
配置虚拟机网卡文件ifcfg-ens33。
vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_PRIVACY="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="edbc23f0-08c2-4d63-a117-d34fe5c7a615"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.3.100
NETMASK=255.255.255.0
GATEWAY=192.168.3.1
DNS1=114.114.114.114
DNS2=8.8.8.8
DNS3=4.2.2.2
IP,GATEWAY要设置成自己的,可以参考这篇文章中的解释
关于这些字段解释,可以参考这个文章
修改完成保存,然后执行命令 service network restart
重启网络服务。
vmware虚拟机开启之后,直接在vmware操作虚拟机很不方便,不能粘贴复制,显示也很不友好,所以后续用MobaXterm操作虚拟机
选这个然后可以同时操作三台虚拟机
在 Linux 虚拟机中手动安装 VMware Tools
Vmware workstation 安装解压 vmwaretools 提示只读文件“tar: vmware-tools-distrib:无法 mkdir: 只读文件系统”
不建议使用CentOS 7 自带的yum源,因为安装软件和依赖时会非常慢甚至超时失败。这里,我们使用阿里云的源予以替换,执行如下命令,替换文件/etc/yum.repos.d/CentOS-Base.repo:
yum install wget -y yum-utils device-mapper-persistent-data lvm2 psmisc net-tools telnet
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
防火墙一定要提前关闭,否则在后续安装K8S集群的时候是个trouble maker。执行下面语句关闭,并禁用开机启动:
systemctl stop firewalld & systemctl disable firewalld
systemctl disable --now dnsmasq
systemctl disable --now NetworkManager
NetworkManager 公有云不要关闭,公司私有的主机要确定一下有没有用到
类似ElasticSearch集群,在安装K8S集群时,Linux的Swap内存交换机制是一定要关闭的,否则会因为内存交换而影响性能以及稳定性。这里,我们可以提前进行设置:执行 swapoff -a可临时关闭,但系统重启后恢复。用vim编辑/etc/fstab,即:
vim /etc/fstab
注释掉包含swap的那一行即可,重启后可永久关闭,如下所示:
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
包括将桥接的 IPv4 流量传递到 iptables 的链
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
net.ipv4.conf.all.route_localnet = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
生效
sysctl --system
net.ipv4.ip_forward 是pod 之间的路由转发的时候用到
重启之后检查有没有被加载
reboot
lsmod | grep --color=auto -e ip_vs -e nf_conntrack
集群的时间必须同步,与证书的签发有关系
设置时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
yum install ntpdate -y
ntpdate time.windows.com
使用阿里云时间服务器
crontab -e
0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com
这个是文件句柄,默认为1024,有可能存在集群使用一段时间之后,无法建立文件句柄的情况发生
ulimit -SHn 65535
vim /etc/security/limits.conf
末尾添加如下内容
* soft nofile 65536
* hard nofile 131072
* soft nproc 65535
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
查看当前内核3.10.0-1160.76.1.el7.x86_64
uname -r
第一个组数字:3, 主版本号
第二个组数字:10, 次版本号,当前为稳定版本,一般这个数字为偶数表示稳定,奇数表示在开发版本,通常这样的不做生产使用。
第三个组数字:0, 修订版本号
第四个组数字:1160.76.1,表示发型版本的补丁版本
el7:则表示我正在使用的内核是 RedHat / CentOS 系列发行版专用内核 ,centos7
x86_64:采用的是适用64位的CPU的操作系统。
3.x升级到5.x
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
删除旧版的内核
yum remove $(rpm -qa | grep kernel | grep -v $(uname -r))
可以看到k8s中节点中ipvs的配置,路由的配置,转发的配置
yum install ipvsadm ipset sysstat conntrack libseccomp -y
所有节点配置ipvs模块:
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
vim /etc/modules-load.d/ipvs.conf
加入以下内容
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_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
然后执行systemctl enable --now systemd-modules-load.service
即可
在安装k8s组件之前,此处关机拍快照保存,后续二进制安装的时候,从快照恢复
开机快照会占用较大空间而且容易文件丢失,建议用命令关机
shutdown -h now
其他几台机器不要用克隆,建议手动安装其他几台机器
克隆会有网络问题
克隆会有网络问题
克隆会有网络问题
我用的3台master ,因为master 可以当node 使用,而且台式机的硬件配置不够高,不能一次启动5个虚拟机,有条件的建议,3台master,2台node
方法同master 的修改,记得修改之后,重启 service network restart
在三台机器分别执行
hostnamectl set-hostname k8smaster1
hostnamectl set-hostname k8smaster2
hostnamectl set-hostname k8smaster3
cat >> /etc/hosts << EOF
192.168.3.100 k8smaster1
192.168.3.101 k8smaster2
192.168.3.102 k8smaster3
192.168.3.100 k8smaster-lb
EOF
装过程中生成配置文件和证书均在Master01上操作,集群管理也在Master01上操作,阿里云或者AWS上需要单独一台kubectl服务器。密钥配置如下:
ssh-keygen -t rsa
for i in k8smaster1 k8smaster2 k8smaster3;do ssh-copy-id -i /root/.ssh/id_rsa.pub $i;done
大于1.24 使用Containerd
装docker的同时会把Containerd安装上,而且后期学习也用用到docker
每个节点安装
yum install -y docker-ce-20.10.* docker-ce-cli-20.10.*
可以无需启动Docker,只需要配置和启动Containerd即可。
首先配置Containerd所需的模块(所有节点)
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
所有节点加载模块
modprobe -- overlay
modprobe -- br_netfilter
所有节点,配置Containerd所需的内核
cat <<EOF | tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
所有节点加载内核:
sysctl --system
所有节点配置Containerd的配置文件:
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
所有节点将Containerd的Cgroup改为Systemd:
k8s推荐Systemd 作为隔离机制(如果用docker,也需要更改)
vim /etc/containerd/config.toml
找到containerd.runtimes.runc.options
,添加SystemdCgroup = true
(如果已存在直接修改,否则会报错),如下图所示:
将sandbox_image
的Pause
镜像改成符合自己版本的地址registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
所有节点启动Containerd,并配置开机自启动:
systemctl daemon-reload
systemctl enable --now containerd
所有节点配置crictl客户端连接的运行时位置,找到哪个containnerd的sock 去执行命令
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
首先在Master01节点查看最新的Kubernetes版本是多少:
yum list kubeadm.x86_64 --showduplicates | sort -r
所有节点安装1.24.2版本kubeadm、kubelet和kubectl:
yum install -y kubelet-1.24.2 kubeadm-1.24.2 kubectl-1.24.2
如果选择的是Containerd作为的Runtime,需要更改Kubelet的配置使用Containerd作为Runtime,所有节点执行:
cat >/etc/sysconfig/kubelet<
systemctl daemon-reload
systemctl enable kubelet
以上,基本完成了虚拟机的配置。
(注意:如果不是高可用集群,haproxy和keepalived无需安装)
公有云要用公有云自带的负载均衡,比如阿里云的SLB,腾讯云的ELB,用来替代haproxy和keepalived,因为公有云大部分都是不支持keepalived的,另外如果用阿里云的话,kubectl控制端不能放在master节点,推荐使用腾讯云,因为阿里云的slb有回环的问题,也就是slb代理的服务器不能反向访问SLB,但是腾讯云修复了这个问题。
如果是单个master节点,不需要安装haproxy和keepalived
所有Master节点通过yum安装HAProxy和KeepAlived
yum install keepalived haproxy -y
所有Master节点配置HAProxy(详细配置参考HAProxy文档,所有Master节点的HAProxy配置相同):
vim /etc/haproxy/haproxy.cfg
如果文件中有的话,要全部删掉(vim 执行 gg
这里是跳至文件首行再命令dG
),再输入
global
maxconn 2000
ulimit-n 16384
log 127.0.0.1 local0 err
stats timeout 30s
defaults
log global
mode http
option httplog
timeout connect 5000
timeout client 50000
timeout server 50000
timeout http-request 15s
timeout http-keep-alive 15s
frontend monitor-in
bind *:33305
mode http
option httplog
monitor-uri /monitor
frontend k8s-master
bind 0.0.0.0:16443
bind 127.0.0.1:16443
mode tcp
option tcplog
tcp-request inspect-delay 5s
default_backend k8s-master
backend k8s-master
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server k8smaster1 192.168.3.100:6443 check
server k8smaster2 192.168.3.101:6443 check
server k8smaster3 192.168.3.102:6443 check
systemctl restart haproxy
检查一下16443端口有没有被监听
netstat -lntp
所有Master节点配置KeepAlived,配置不一样,注意区分 [root@k8smaster1 pki]# vim /etc/keepalived/keepalived.conf ,注意每个节点的IP和网卡(interface参数,这个后面是网卡名称ip a
命令查看)
vim /etc/keepalived/keepalived.conf
网卡的名称需要改成自己的,我就就是ens33
,通过ip a
命令查看
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
mcast_src_ip 192.168.3.100
virtual_router_id 51
priority 101
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.3.100
}
track_script {
chk_apiserver
}
}
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
mcast_src_ip 192.168.3.101
virtual_router_id 51
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.3.100
}
track_script {
chk_apiserver
}
}
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
mcast_src_ip 192.168.3.102
virtual_router_id 51
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.3.100
}
track_script {
chk_apiserver
}
}
所有master节点配置KeepAlived健康检查文件
循环探测haproxy的进程在不在,不在的话,VIP 会跳到master节点的其他节点
vim /etc/keepalived/check_apiserver.sh
#!/bin/bash
err=0
for k in $(seq 1 3)
do
check_code=$(pgrep haproxy)
if [[ $check_code == "" ]]; then
err=$(expr $err + 1)
sleep 1
continue
else
err=0
break
fi
done
if [[ $err != "0" ]]; then
echo "systemctl stop keepalived"
/usr/bin/systemctl stop keepalived
exit 1
else
exit 0
fi
chmod +x /etc/keepalived/check_apiserver.sh
启动haproxy和keepalived
systemctl daemon-reload
systemctl enable --now haproxy
systemctl enable --now keepalived
重要:如果安装了keepalived和haproxy,需要测试keepalived是否是正常的
测试VIP(k8smaster1)
ping 192.168.3.100 -c 4
telnet 192.168.3.100 16443
以下操作只在k8smaster1节点执行
vim kubeadm-config.yaml
注意更改kubernetesVersion的值和自己服务器kubeadm的版本一致:kubeadm version
certSANs改成你的vip或者公有云的负载均衡地址,证书颁发到这个地址,其他节点都是通过这个地址转发
controlPlaneEndpoint 是vip地址+HAProxy的端口
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: 7t2weq.bjbawausm0jaxury
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.3.100
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
name: k8smaster1
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
certSANs:
- 192.168.3.100
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.3.100:16443
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.24.2
networking:
dnsDomain: cluster.local
podSubnet: 172.16.0.0/12
serviceSubnet: 10.96.0.0/16
scheduler: {}
更新kubeadm文件
kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml
将new.yaml文件复制到其他master节点,
for i in k8smaster2 k8smaster3; do scp new.yaml $i:/root/; done
之后所有Master节点提前下载镜像,可以节省初始化时间(其他节点不需要更改任何配置,包括IP地址也不需要更改):
kubeadm config images pull --config /root/new.yaml
所有节点设置开机自启动kubelet
systemctl enable --now kubelet
(如果启动失败无需管理,初始化成功以后即可启动)
k8smaster1节点初始化,初始化以后会在/etc/kubernetes
目录下生成对应的证书和配置文件,之后其他Master节点加入k8smaster2即可:
kubeadm init --config /root/new.yaml --upload-certs
如果失败kubeadm reset -f ; ipvsadm --clear ; rm -rf ~/.kube
回退
可以查看/var/log/messages
日志信息
初始化成功以后,会产生Token值,用于其他节点加入时使用,因此要记录下初始化成功生成的token值(令牌值)
k8smaster1节点配置环境变量,用于访问Kubernetes集群:
kubectl 命令是通过配置文件连接到集群
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
采用初始化安装方式,所有的系统组件均以容器的方式运行并且在kube-system命名空间内,此时可以查看Pod状态:
kubectl get po -n kube-system
多了一个证书key
kubeadm join 192.168.3.100:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:4a792b61810b1edca5e757ea7fdf5374fe3ac00fd2fcd431ac939833eb7c7ca1 \
--control-plane --certificate-key 6c45b60bb62b6a4262a06a3770d789583c9c25353b5ca13e081a2e09d30c60f0
kubeadm join 192.168.3.100:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:4a792b61810b1edca5e757ea7fdf5374fe3ac00fd2fcd431ac939833eb7c7ca1
新建的集群时间是24小时,查看token时间
kubectl get secret -n kube-system
查看节点加入集群用的token是哪一个,打开new.yaml中token: 7t2weq.bjbawausm0jaxury
后面的7t2weq
意味着你要使用这个token加入集群
kubectl get secret -n kube-system |grep 7t2weq
kubectl get secret -n kube-system bootstrap-token-7t2weq -oyaml
apiVersion: v1
data:
auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4=
expiration: MjAyMi0wNi0yN1QwODo0NjozOFo=
token-id: N3Qyd2Vx
token-secret: YmpiYXdhdXNtMGpheHVyeQ==
usage-bootstrap-authentication: dHJ1ZQ==
usage-bootstrap-signing: dHJ1ZQ==
kind: Secret
metadata:
creationTimestamp: "2022-06-26T08:46:38Z"
name: bootstrap-token-7t2weq
namespace: kube-system
resourceVersion: "264"
uid: 58176a1b-f945-448f-ad1e-be6f0bfad072
type: bootstrap.kubernetes.io/token
expiration
是加密过的,解密过后查看(输出的时间要加8小时)
echo "MjAyMi0wNi0yN1QwODo0NjozOFo=" |base64 -d
以下步骤是上述init命令产生的Token过期了才需要执行以下步骤,如果没有过期不需要执行,直接join即可
Token过期后生成新的token:
kubeadm token create --print-join-command
Master需要生成–certificate-key
kubeadm init phase upload-certs --upload-certs
CNI网络插件 是pod 之间通讯必备的组件
k8smaster1 上执行
cd /root/ ; git clone https://github.com/dotbalo/k8s-ha-install.git
cd /root/k8s-ha-install && git checkout manual-installation-v1.24.x && cd calico/
修改Pod网段:
POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`
将输出的内容改到calico.yaml文件中
sed -i "s#POD_CIDR#${POD_SUBNET}#g" calico.yaml
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
直到结果的STATUS全部为running
执行可以看到node节点全部ready
kubectl get nodes
kubectl get po -n kube-system -owide
在新版的Kubernetes中系统资源的采集均使用Metrics-server,可以通过Metrics采集节点和Pod的内存、磁盘、CPU和网络的使用率
将k8smaster1节点的front-proxy-ca.crt
复制到所有Node节点
scp /etc/kubernetes/pki/front-proxy-ca.crt node节点名称:/etc/kubernetes/pki/front-proxy-ca.crt
记得修改comp.yaml
中的--requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
如果是二进制安装的需要改成front-proxy-ca.pem
,二进制安装生成的证书是pem
,kubeadm安装生成的证书是crt
cd /root/k8s-ha-install/kubeadm-metrics-server
kubectl create -f comp.yaml
查看状态
kubectl get po -n kube-system -l k8s-app=metrics-server
我的一直pending
,用下面的命令查看问题
kubectl describe pods metrics-server-6c48d8f6d6-hgwgq -n kube-server
不能部署到master节点,master节点默认不允许部署pod,通过以下命令删除Taint
kubectl describe nodes -l node-role.kubernetes.io/control-plane= | grep Taints
kubectl taint node -all node-role.kubernetes.io/control-plane-
查看资源
kubectl top node
kubectl top po -A
cd /root/k8s-ha-install/dashboard/
kubectl create -f .
官方GitHub地址,可以在官方dashboard查看到最新版dashboard
在谷歌浏览器(Chrome)启动文件中加入启动参数,用于解决无法访问Dashboard的问题,参考图:
--test-type --ignore-certificate-errors
更改dashboard的svc为NodePort:
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
kubectl get svc -n kubernetes-dashboard
根据自己的实例端口号,通过任意安装了kube-proxy的宿主机的IP+端口即可访问到dashboard:
访问Dashboard:https://192.168.3.100:30453
,选择登录方式为令牌(即token方式)
所有master节点:vim /etc/kubernetes/manifests/kube-apiserver.yaml
,然后在这个文件的command参数的倒数第二行,添加 --feature-gates=LegacyServiceAccountTokenNoAutoGeneration=false
(如果有feature-gates参数,直接在后面添加,LegacyServiceAccountTokenNoAutoGeneration=false即可),然后保存退出,
之后同样的方式修改vim /etc/kubernetes/manifests/kube-controller-manager.yaml
,
保存后重启kubelet。
systemctl restart kubelet
然后删除重建dashboard,重新获取token
kubectl delete -f dashboard-user.yaml
kubectl create -f dashboard-user.yaml
查看token值
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
将Kube-proxy改为ipvs模式,因为在初始化集群的时候注释了ipvs配置,所以需要自行修改一下:
在master01节点执行
kubectl edit cm kube-proxy -n kube-system
mode: "ipvs"
更新Kube-Proxy的Pod:
kubectl patch daemonset kube-proxy -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}" -n kube-system
验证Kube-Proxy模式
curl 127.0.0.1:10249/proxyMode
ipvs
注意:kubeadm安装的集群,证书有效期默认是一年。master节点的kube-apiserver、kube-scheduler、kube-controller-manager、etcd
都是以容器运行的。可以通过kubectl get po -n kube-system
查看。
启动和二进制不同的是,
kubelet的配置文件在/etc/sysconfig/kubelet
和/var/lib/kubelet/config.yaml
,修改后需要重启kubelet进程
其他组件的配置文件在/etc/kubernetes/manifests
目录下,比如kube-apiserver.yaml
,该yaml文件更改后,kubelet会自动刷新配置,也就是会重启pod。不能再次创建该文件
kube-proxy的配置在kube-system命名空间下的configmap中,可以通过
kubectl edit cm kube-proxy -n kube-system
进行更改