kubeadm方式安装k8s
一、安装环境
环境准备:(有阿里云)centos7
k8s-master 192.168.1.11
k8s-node1 192.168.1.22
k8s-node2 192.168.1.33
二、前期准备
在k8s-master主机
[root@k8s-master ~]# vim /etc/hosts //做个域名劫持(三台主机都做)
192.168.1.11 k8s-master
192.168.1.22 k8s-node1
192.168.1.33 k8s-node2
1.配置yum源(三台主机都做)
[root@k8s-master ~]# cd /etc/yum.repos.d/
[root@k8s-master yum.repos.d]# vim kubernetes.repo
[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
[root@k8s-master yum.repos.d]# vim docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[root@k8s-master yum.repos.d]# yum clean all && yum makecache
2.安装必备工具(三台主机都做)
[root@k8s-master yum.repos.d]# yum -y install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git //安装必备工具
3.关闭 防火墙以及swap 分区(三台主机都做)
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# sysctl -w vm.swappiness=0
vm.swappiness = 0
[root@k8s-master ~]# sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
4.同步时间(三台主机都做)
[root@k8s-master yum.repos.d]# cd
[root@k8s-master ~]# yum -y install ntpdate //同步时间
[root@k8s-master ~]# ntpdate time2.aliyun.com
[root@k8s-master ~]# crontab -e //编写计划任务
* 5 * * * /usr/sbin/ntpdate time2.aliyun.com
5. 配置 limit(三台主机都做)
[root@k8s-master ~]# ulimit -SHn 65535 //单个进程可以打开的⽂件数量将被限制为 65535
[root@k8s-master ~]# vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 65535
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
6. 安装 k8s ⾼可⽤性 Git 仓库(master主机)
[root@k8s-master ~]# git clone https://gitee.com/dukuan/k8s-ha-install.git
三、配置内核模块
1. 配置 ipvs 模块(centos可以不用做)(三台主机都做)
[root@k8s-master ~]# yum install ipvsadm ipset sysstat conntrack libseccomp -y
[root@k8s-master ~]# modprobe -- ip_vs
[root@k8s-master ~]# modprobe -- ip_vs_rr
[root@k8s-master ~]# modprobe -- ip_vs_wrr
[root@k8s-master ~]# modprobe -- ip_vs_sh
[root@k8s-master ~]# modprobe -- nf_conntrack
[root@k8s-master ~]# vim /etc/modules-load.d/ipvs.conf
# 在系统启动时加载下列 IPVS 和相关功能所需的模块
ip_vs # 负载均衡模块
ip_vs_lc # 用于实现基于连接数量的负载均衡算法
ip_vs_wlc # 用于实现带权重的最少连接算法的模块
ip_vs_rr # 负载均衡rr算法模块
ip_vs_wrr # 负载均衡wrr算法模块
ip_vs_lblc # 负载均衡算法,它结合了最少连接(LC)算法和基于偏置的轮询(Round Robin with Bias)算法
ip_vs_lblcr # 用于实现基于链路层拥塞状况的最少连接负载调度算法的模块
ip_vs_dh # 用于实现基于散列(Hashing)的负载均衡算法的模块
ip_vs_sh # 用于源端负载均衡的模块
ip_vs_fo # 用于实现基于本地服务的负载均衡算法的模块
ip_vs_nq # 用于实现NQ算法的模块
ip_vs_sed # 用于实现随机早期检测(Random Early Detection)算法的模块
ip_vs_ftp # 用于实现FTP服务的负载均衡模块
ip_vs_sh
nf_conntrack # 用于跟踪网络连接的状态的模块
ip_tables # 用于管理防护墙的机制
ip_set # 用于创建和管理IP集合的模块
xt_set # 用于处理IP数据包集合的模块,提供了与iptables等网络工具的接口
ipt_set # 用于处理iptables规则集合的模块
ipt_rpfilter # 用于实现路由反向路径过滤的模块
ipt_REJECT # iptables模块之一,用于将不符合规则的数据包拒绝,并返回特定的错误码
ipip # 用于实现IP隧道功能的模块,使得数据可以在两个网络之间进行传输
[root@k8s-master ~]# sysctl --system
[root@k8s-master ~]# systemctl enable systemd-modules-load.service
[root@k8s-master ~]# systemctl start systemd-modules-load.service
[root@k8s-master ~]# lsmod | grep -e ip_vs -e nf_conntrack //查看已写⼊加载的模块
2. 配置 k8s 内核(三台主机都做)
[root@k8s-master ~]# vim /etc/sysctl.d/k8s.conf
# 写入k8s所需内核模块
net.bridge.bridge-nf-call-iptables = 1 # 控制网络桥接与iptables之间的网络转发行为
net.bridge.bridge-nf-call-ip6tables = 1 # 用于控制网络桥接(bridge)的IP6tables过滤规则。当该参数设置为1时,表示启用对网络桥接的IP6tables过滤规则
fs.may_detach_mounts = 1 # 用于控制文件系统是否允许分离挂载,1表示允许
net.ipv4.conf.all.route_localnet = 1 # 允许本地网络上的路由。设置为1表示允许,设置为0表示禁止。
vm.overcommit_memory=1 # 控制内存分配策略。设置为1表示允许内存过量分配,设置为0表示不允许。
vm.panic_on_oom=0 # 决定当系统遇到内存不足(OOM)时是否产生panic。设置为0表示不产生panic,设置为1表示产生panic。
fs.inotify.max_user_watches=89100 # inotify可以监视的文件和目录的最大数量。
fs.file-max=52706963 # 系统级别的文件描述符的最大数量。
fs.nr_open=52706963 # 单个进程可以打开的文件描述符的最大数量。
net.netfilter.nf_conntrack_max=2310720 # 网络连接跟踪表的最大大小。
net.ipv4.tcp_keepalive_time = 600 # TCP保活机制发送探测包的间隔时间(秒)。
net.ipv4.tcp_keepalive_probes = 3 # TCP保活机制发送探测包的最大次数。
net.ipv4.tcp_keepalive_intvl =15 # TCP保活机制在发送下一个探测包之前等待响应的时间(秒)。
net.ipv4.tcp_max_tw_buckets = 36000 # TCP TIME_WAIT状态的bucket数量。
net.ipv4.tcp_tw_reuse = 1 # 允许重用TIME_WAIT套接字。设置为1表示允许,设置为0表示不允许。
net.ipv4.tcp_max_orphans = 327680 # 系统中最大的孤套接字数量。
net.ipv4.tcp_orphan_retries = 3 # 系统尝试重新分配孤套接字的次数。
net.ipv4.tcp_syncookies = 1 # 用于防止SYN洪水攻击。设置为1表示启用SYN cookies,设置为0表示禁用。
net.ipv4.tcp_max_syn_backlog = 16384 # SYN连接请求队列的最大长度。
net.ipv4.ip_conntrack_max = 65536 # IP连接跟踪表的最大大小。
net.ipv4.tcp_max_syn_backlog = 16384 # 系统中最大的监听队列的长度。
net.ipv4.tcp_timestamps = 0 # 用于关闭TCP时间戳选项。
net.core.somaxconn = 16384 # 用于设置系统中最大的监听队列的长度
[root@k8s-master ~]# reboot //保存后,所有节点重启,保证重启后内核依然加载
[root@k8s-master ~]# lsmod | grep --color=auto -e ip_vs -e nf_conntrack
四、基本组件安装
1. 安装 Containerd
(1)安装 Docker(三台主机都做)
[root@k8s-master ~]# yum remove -y podman runc containerd
[root@k8s-master ~]# yum remove -y docker
[root@k8s-master ~]# yum -y install docker-ce docker-ce-cli containerd.io //安装Docker和containerd
(2)配置 Containerd 所需模块(三台主机都做)
[root@k8s-master ~]# cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf //也可以用vim写
> overlay
> br_netfilter
> EOF
overlay
br_netfilter
[root@k8s-master ~]# modprobe -- overlay
[root@k8s-master ~]# modprobe -- br_netfilter
(3)配置 Containerd 所需内核(三台主机都做)
[root@k8s-master ~]# cat <<EOF | sudo 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
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@k8s-master ~]# sysctl --system //使生效
(4)Containerd 配置⽂件(三台主机都做)
[root@k8s-master ~]# mkdir -p /etc/containerd //这个目录其实是有的,这里只是为了确保一下
[root@k8s-master ~]# containerd config default | tee /etc/containerd/config.toml
[root@k8s-master ~]# vim /etc/containerd/config.toml
disabled_plugins = []
imports = []
oom_score = 0
plugin_dir = ""
required_plugins = []
root = "/var/lib/containerd"
state = "/run/containerd"
temp = ""
version = 2
[cgroup]
path = ""
[debug]
address = ""
format = ""
gid = 0
level = ""
uid = 0
[grpc]
address = "/run/containerd/containerd.sock"
gid = 0
max_recv_message_size = 16777216
max_send_message_size = 16777216
tcp_address = ""
tcp_tls_ca = ""
tcp_tls_cert = ""
tcp_tls_key = ""
uid = 0
[metrics]
address = ""
grpc_histogram = false
[plugins]
[plugins."io.containerd.gc.v1.scheduler"]
deletion_threshold = 0
mutation_threshold = 100
pause_threshold = 0.02
schedule_delay = "0s"
startup_delay = "100ms"
[plugins."io.containerd.grpc.v1.cri"]
device_ownership_from_security_context = false
disable_apparmor = false
disable_cgroup = false
disable_hugetlb_controller = true
disable_proc_mount = false
disable_tcp_service = true
drain_exec_sync_io_timeout = "0s"
enable_selinux = false
enable_tls_streaming = false
enable_unprivileged_icmp = false
enable_unprivileged_ports = false
ignore_deprecation_warnings = []
ignore_image_defined_volumes = false
max_concurrent_downloads = 3
max_container_log_line_size = 16384
netns_mounts_under_state_dir = false
restrict_oom_score_adj = false
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"
selinux_category_range = 1024
stats_collect_period = 10
stream_idle_timeout = "4h0m0s"
stream_server_address = "127.0.0.1"
stream_server_port = "0"
systemd_cgroup = false
tolerate_missing_hugetlb_controller = true
unset_seccomp_profile = ""
[plugins."io.containerd.grpc.v1.cri".cni]
bin_dir = "/opt/cni/bin"
conf_dir = "/etc/cni/net.d"
conf_template = ""
ip_pref = ""
max_conf_num = 1
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "runc"
disable_snapshot_annotations = true
discard_unpacked_layers = false
ignore_rdt_not_enabled_errors = false
no_pivot = false
snapshotter = "overlayfs"
[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime]
base_runtime_spec = ""
cni_conf_dir = ""
cni_max_conf_num = 0
container_annotations = []
pod_annotations = []
privileged_without_host_devices = false
runtime_engine = ""
runtime_path = ""
runtime_root = ""
runtime_type = ""
[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime.options]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
base_runtime_spec = ""
cni_conf_dir = ""
cni_max_conf_num = 0
container_annotations = []
pod_annotations = []
privileged_without_host_devices = false
runtime_engine = ""
runtime_path = ""
runtime_root = ""
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
BinaryName = ""
CriuImagePath = ""
CriuPath = ""
CriuWorkPath = ""
IoGid = 0
IoUid = 0
NoNewKeyring = false
NoPivotRoot = false
Root = ""
ShimCgroup = ""
SystemdCgroup =true
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"
[plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime]
base_runtime_spec = ""
cni_conf_dir = ""
cni_max_conf_num = 0
container_annotations = []
pod_annotations = []
privileged_without_host_devices = false
runtime_engine = ""
runtime_path = ""
runtime_root = ""
runtime_type = ""
[plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime.options]
[plugins."io.containerd.grpc.v1.cri".image_decryption]
key_model = "node"
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = ""
[plugins."io.containerd.grpc.v1.cri".registry.auths]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.headers]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
tls_cert_file = ""
tls_key_file = ""
[plugins."io.containerd.internal.v1.opt"]
path = "/opt/containerd"
[plugins."io.containerd.internal.v1.restart"]
interval = "10s"
[plugins."io.containerd.internal.v1.tracing"]
[plugins."io.containerd.metadata.v1.bolt"]
content_sharing_policy = "shared"
[plugins."io.containerd.monitor.v1.cgroups"]
no_prometheus = false
[plugins."io.containerd.runtime.v1.linux"]
no_shim = false
runtime = "runc"
runtime_root = ""
shim = "containerd-shim"
shim_debug = false
[plugins."io.containerd.runtime.v2.task"]
platforms = ["linux/amd64"]
sched_core = false
[plugins."io.containerd.service.v1.diff-service"]
default = ["walking"]
[plugins."io.containerd.service.v1.tasks-service"]
rdt_config_file = ""
[plugins."io.containerd.snapshotter.v1.aufs"]
root_path = ""
[plugins."io.containerd.snapshotter.v1.btrfs"]
root_path = ""
[plugins."io.containerd.snapshotter.v1.devmapper"]
async_remove = false
base_image_size = ""
discard_blocks = false
fs_options = ""
fs_type = ""
pool_name = ""
root_path = ""
[plugins."io.containerd.snapshotter.v1.native"]
root_path = ""
[plugins."io.containerd.snapshotter.v1.overlayfs"]
mount_options = []
root_path = ""
sync_remove = false
upperdir_label = false
[plugins."io.containerd.snapshotter.v1.zfs"]
root_path = ""
[plugins."io.containerd.tracing.processor.v1.otlp"]
[proxy_plugins]
[stream_processors]
[stream_processors."io.containerd.ocicrypt.decoder.v1.tar"]
accepts = ["application/vnd.oci.image.layer.v1.tar+encrypted"]
args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]
env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]
path = "ctd-decoder"
returns = "application/vnd.oci.image.layer.v1.tar"
[stream_processors."io.containerd.ocicrypt.decoder.v1.tar.gzip"]
accepts = ["application/vnd.oci.image.layer.v1.tar+gzip+encrypted"]
args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]
env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]
path = "ctd-decoder"
returns = "application/vnd.oci.image.layer.v1.tar+gzip"
[timeouts]
"io.containerd.timeout.bolt.open" = "0s"
"io.containerd.timeout.shim.cleanup" = "5s"
"io.containerd.timeout.shim.load" = "5s"
"io.containerd.timeout.shim.shutdown" = "3s"
"io.containerd.timeout.task.state" = "2s"
[ttrpc]
address = ""
gid = 0
uid = 0
[root@k8s-master ~]# systemctl daemon-reload //加载systemctl控制脚本
[root@k8s-master ~]# systemctl enable --now containerd.service //开机启动,--now表示现在就启动
(5)配置 crictl 客户端连接的运⾏位置(三台主机都做)
[root@k8s-master ~]# vim /etc/crictl.yaml //配置容器运⾏环境的crictl.yml⽂件
runtime-endpoint: unix:///run/containerd/containerd.sock # 指定了容器运⾏时的地址为:unix://...
image-endpoint: unix:///run/containerd/containerd.sock # 指定了镜像运⾏时的地址为:unix://...
timeout: 10 # 设置了超时时间为10秒
debug: false # 关闭调试模式
[root@k8s-master ~]# systemctl status containerd //查看状态,是否启动
2.安装 Kubernetes 组件(三台主机都做)
[root@k8s-master ~]# yum list kubeadm.x86_64 --showduplicates | sort -r #查询最新的Kubernetes版本号
[root@k8s-master ~]# yum install kubeadm-1.28* kubectl-1.28* kubelet-1.28* -y # 安装1.28最新版本kubeadm、kubelet和kubectl
[root@k8s-master ~]# yum list installed|grep kube //查看这些是否安装
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl start kubelet
[root@k8s-master ~]# systemctl enable kubelet
[root@k8s-master ~]# systemctl status kubelet //查看是否启动
注意:如果kubelet无法正常启动,检查swap是否已经取消虚拟分区,查看/var/log/message,如果是没有/var/lib/kubelet/config.yaml文件,可能需要重新安装,先卸载kubelet,然后重新安装,systemctl daemon-reload重新加载以后,安装kubeadm(因为依赖原因被卸载),在设置开机自启并启动systemctl enable --now kudelet
3. Kubernetes 集群初始化(主节点做)
(1)Kubeadm 配置⽂件
[root@k8s-master ~]# vim kubeadm-config.yaml #修改kubeadm配置⽂件
apiVersion: kubeadm.k8s.io/v1beta3 # 指定Kubernetes配置文件的版本,使用的是kubeadm API的v1beta3版本
bootstrapTokens: # 定义bootstrap tokens的信息。这些tokens用于在Kubernetes集群初始化过程中进行身份验证
- groups: # 定义了与此token关联的组
- system:bootstrappers:kubeadm:default-node-token
token: 7t2weq.bjbawausm0jaxury # bootstrap token的值
ttl: 24h0m0s # token的生存时间,这里设置为24小时
usages: # 定义token的用途
- signing # 数字签名
- authentication # 身份验证
kind: InitConfiguration # 指定配置对象的类型,InitConfiguration:表示这是一个初始化配置
localAPIEndpoint: # 定义本地API端点的地址和端口
advertiseAddress: 192.168.1.11
bindPort: 6443
nodeRegistration: # 定义节点注册时的配置
criSocket: unix:///var/run/containerd/containerd.sock # 容器运行时(CRI)的套接字路径
name: k8s-master # 节点的名称
taints: # 标记
- effect: NoSchedule # 免调度节点
key: node-role.kubernetes.io/control-plane # 该节点为控制节点
---
apiServer: # 定义了API服务器的配置
certSANs: # 为API服务器指定了附加的证书主体名称(SAN),指定IP即可
- 192.168.1.11
timeoutForControlPlane: 4m0s # 控制平面的超时时间,这里设置为4分钟
apiVersion: kubeadm.k8s.io/v1beta3 # 指定API Server版本
certificatesDir: /etc/kubernetes/pki # 指定了证书的存储目录
clusterName: kubernetes # 定义了集群的名称为"kubernetes"
controlPlaneEndpoint: 192.168.1.11:6443 # 定义了控制节点的地址和端口
controllerManager: {} # 控制器管理器的配置,为空表示使用默认配置
etcd: # 定义了etcd的配置
local: # 本地etcd实例
dataDir: /var/lib/etcd # 数据目录
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 指定了Kubernetes使用的镜像仓库的地址,阿里云的镜像仓库。
kind: ClusterConfiguration # 指定了配置对象的类型,ClusterConfiguration:表示这是一个集群配置
kubernetesVersion: v1.28.2 # 指定了kubernetes的版本
networking: # 定义了kubernetes集群网络设置
dnsDomain: cluster.local # 定义了集群的DNS域为:cluster.local
podSubnet: 172.16.0.0/16 # 定义了Pod的子网
serviceSubnet: 10.96.0.0/16 # 定义了服务的子网
scheduler: {} # 使用默认的调度器行为
[root@k8s-master ~]# kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml //将旧的kubeadm配置文件转换为新的格式
(2)下载组件镜像
[root@k8s-master ~]# kubeadm config images pull --config /root/new.yaml //通过新的new.yaml文件从指定的仓库拉取kubeadm组件镜像
(3)集群初始化
[root@k8s-master ~]# kubeadm init --config /root/new.yaml --upload-certs
后面这些记得保存,后面添加节点要用:
kubeadm join 192.168.1.11:6443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:47ed12a3edb4c5d68ad413f4113a08a98c50f6b7805d8e668f667819827f01d2
(4)初始化失败排查
I.初始化重置
如果初始化失败,重置后再次初始化,命令如下(没有失败不要执⾏!!!)
[root@k8s-master ~]# kubeadm reset -f ; ipvsadm --clear ; rm -rf ~/.kube
II.如果初始化不成功
通过⽇志找到错误原因:CentOS⽇志路径:/var/log/messages
1.内存必须大点,2核2G
2.echo 1 > /proc/net/ipv4/ip_foeward
3.kubelet无法启动(连接超时)
(1)swap虚拟分区没关
(2)没有配置文件
(3)配置文件IP错误(new.yaml)
4.Containerd 配置⽂件错误(vim /etc/containerd/config.toml)
(5)加载环境变量
[root@k8s-master ~]# vim .bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
[root@k8s-master ~]# source .bashrc
拍个快照吧
4.Node 节点配置
(1)node 加⼊集群(在node1和node2里面做)
[root@k8s-node1 ~]# kubeadm join 192.168.1.11:6443 --token 7t2weq.bjbawausm0jaxury --discovery-token-ca-cert-hash sha256:47ed12a3edb4c5d68ad413f4113a08a98c50f6b7805d8e668f667819827f01d2
[root@k8s-node2 ~]# kubeadm join 192.168.1.11:6443 --token 7t2weq.bjbawausm0jaxury --discovery-token-ca-cert-hash sha256:47ed12a3edb4c5d68ad413f4113a08a98c50f6b7805d8e668f667819827f01d2
(2)查看集群状态
[root@k8s-master ~]# kubectl get node //获取所有节点信息
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 39m v1.28.2
k8s-node1 NotReady <none> 3m7s v1.28.2
k8s-node2 NotReady <none> 2m39s v1.28.2
(3)查看容器和节点状态
[root@k8s-master ~]# kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6554b8b87f-2gtst 0/1 Pending 0 52m
kube-system coredns-6554b8b87f-m6wsw 0/1 Pending 0 52m
kube-system etcd-k8s-master 1/1 Running 1 53m
kube-system kube-apiserver-k8s-master 1/1 Running 1 53m
kube-system kube-controller-manager-k8s-master 1/1 Running 1 53m
kube-system kube-proxy-r2xmz 1/1 Running 0 16m
kube-system kube-proxy-tthq6 1/1 Running 0 52m
kube-system kube-proxy-xgtmk 1/1 Running 0 16m
kube-system kube-scheduler-k8s-master 1/1 Running 1 53m
5.Calico组件安装
(1)切换git分支
[root@k8s-master ~]# cd k8s-ha-install/
[root@k8s-master k8s-ha-install]# git checkout manual-installation-v1.28.x
分支 manual-installation-v1.28.x 设置为跟踪来自 origin 的远程分支 manual-installation-v1.28.x。
切换到一个新分支 'manual-installation-v1.28.x'
[root@k8s-master k8s-ha-install]# cd calico/
(2)修改Pod网段
[root@k8s-master calico]# cat ~/new.yaml | grep Sub
podSubnet: 172.16.0.0/16
serviceSubnet: 10.96.0.0/16
[root@k8s-master calico]# POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`
[root@k8s-master calico]# sed -i "s#POD_CIDR#${POD_SUBNET}#g" calico.yaml
[root@k8s-master calico]# kubectl apply -f calico.yaml
[root@k8s-master calico]# kubectl get po -n kube-system
相关文章:

kubeadm方式安装k8s
一、安装环境 环境准备:(有阿里云)centos7 k8s-master 192.168.1.11 k8s-node1 192.168.1.22 k8s-node2 192.168.1.33 二、前期准备 在k8s-master主机 [rootk8s-master ~]# vim /etc/hosts…...

如何使用go生成可执行文件
在 Go 中生成可执行文件非常简单。你可以使用 go build或者go install 命令。以下是步骤: 1. 步骤 1.1. 打开终端,导航到你的 Go 项目目录 确保你在包含 main 包的目录中,通常这是项目的根目录或包含 main.go 文件的目录。 1.2. 运行 go …...

手写Promise
构造器的实现 const PENDING pending; const FULFILLED fulfilled; const REJECTED rejectedclass MyPromise{#state PENDING;#result undefined;constructor(executor){const resolve (data) > {this.#changeState(FULFILLED, data);};const reject (reason) > …...

深度学习云服务器免费使用教程
#云服务器# #深度学习# #人工智能# #计算机视觉# 本文为各位学习深度学习的入门选手而创建,降低深度学习的入门门槛。 谷歌云服务器Colab: T4GPU。限额,需要科学上网,不能使用终端。 谷歌云服务器地址:欢迎使用 C…...

使用ansible的剧本制作salt-master与salt-minion的安装与启动服务过程
虚拟机版本:Rocky Linux release 8.6 (Green Obsidian) 准备几台虚拟机 ipv4地址主机名192.168.137.13center192.168.137.14sp-1192.168.137.15sp-2192.168.137.16sp-3 一、center主机的配置 1.vim /etc/hosts 127.0.0.1 localhost localhost.localdomain loc…...

数据库sqlite3
用数据库函数完成数据的增删改查 增: 将要存储的信息录入到结构体中,再使用snprintf函数信息结合sqlite3命令语句使用sqlite3_exec函数完成插入。 int do_insert(sqlite3 *ppDb) {Worker Work;printf("输入插入的工号:");scanf("%d&qu…...

开发基础之Python 函数(Basic Python Functions for Development)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

Django_Vue3_ElementUI_Release_001_项目初始化
1. 数据库 1.1 安装 https://blog.csdn.net/rbx508780/article/details/127176754 1.2 创建数据库 1.3 DBeaver可视化数据库 https://dbeaver.io/download/ 2 安装Python(3.9.12) 2.1 下载地址 https://www.python.org/downloads/release/python-3912/ 2.2 设定国内源 pip …...

MySQL之安装与基础知识
目录 一:在centos7上安装MySQL数据库 1.卸载默认存在的环境 2.配置mysql的yum源 3. 安装MySQL 4.登录mysql 5.设置MySQL的配置文件 二:MySQL基础知识 1.什么是数据库 2.主流数据库 3.服务器,数据库,表关系及使用案例 4…...

前端基础 | HTML基础:HTML结构,HTML常见标签
文章目录 HTML1、HTML结构1.1HTML标签1.1.1标签1.1.2标签含义 1.2HTML文件基本结构1.3标签层次结构1.4 快速生成代码框架 2、HTML常见标签2.1注释标签2.2标题标签:h1–h62.3段落标签:p2.4 换行标签:br2.5格式化标签2.6 图片标签:i…...

宏任务和微任务+超全面试真题
概念 微任务和宏任务是在异步编程中经常使用的概念,用于管理任务的执行顺序和优先级。 宏任务:setTimeout, setInterval,I/O 操作和 UI 渲染等。微任务: Promise 回调、async/await等 微任务通常比宏任务具有更高的优先级。 执…...

针对SVM算法初步研究
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝心态决定高度,细节决定成败…...

Java中的`String`不可变性详解
在Java中,String类具有不可变性(immutable),这意味着一旦String对象被创建,它的值将无法更改。所有对字符串的修改操作(如拼接、替换等)实际上都会生成一个新的字符串对象,而不会修改…...

c# SMTP发送邮件
string from ""; string fromAlias "MIS-TC"; string[] to { "" }; string subject "问题提交"; string body sb.ToString(); string ipaddr "smtp.email.qq.com"; int port 25; string credit ""; strin…...

GPU基础 -- 并行化与阿姆达尔定律
并行化与阿姆达尔定律 并行化是将计算任务分割成多个部分,使这些部分能够在多个处理器或核心上同时运行,从而加速任务的完成时间。阿姆达尔定律(Amdahl’s Law)则揭示了并行化所能带来的加速效果的限制。 阿姆达尔定律公式 阿姆…...

Lua热更
Lua 热更 前提 Lua是轻量级,可以解释执行的编程语言、性能好 基本原则 1.场景空 代码控制物体加载释放 2.场景一个 3.节点不手动挂代码 4.AssetsBundle资源管理 5.Lua开发框架 6.调试模式、发布模式 XLua 热更框架 XLua是C#环境下Lua的解决方案 1.Lua虚拟…...

提升汽车行业软件质量:ASPICE培训的关键实践方法
ASPICE(汽车行业软件过程改进和能力确定)培训是一种针对汽车行业软件开发和维护过程的标准化培训。 该培训旨在帮助组织提高其软件开发和维护过程的质量和效率。以下是ASPICE培训的一些最佳实践方法: 1. 理解ASPICE框架:首先&…...

2024 全新智能识别 API 接口震撼登场
近年来,随着人工智能技术的快速发展,智能识别技术逐渐成为了各个领域的热门应用。在这个大背景下,2024 年的全新智能识别 API 接口横空出世,为我们的生活带来了更多的便利。本文将为大家详细介绍这个全新智能识别 API 接口&#x…...

《UniVS: Unified and Universal Video Segmentation with Prompts as Queries》要点提炼
论文来源:https://arxiv.org/abs/2402.18115 《UniVS: Unified and Universal Video Segmentation with Prompts as Queries》是2024CVPR中的一篇关于视频分割的论文, 主要内容: 论文提出了一个名为UniVS的新型统一视频分割架构,…...

计算机毕业设计选题推荐-推拿知识互动平台-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

基于SpringBoot+Vue+MySQL的瑜伽馆管理系统
系统展示 用户前台界面 管理员后台界面 系统背景 本系统采用SpringBoot作为后端框架,Vue.js构建前端用户界面,MySQL作为数据库存储系统,实现了瑜伽馆的全面数字化管理。系统涵盖会员管理、课程预约、教练排班、收入统计等功能模块,…...

【MySQL】EXPLAIN(执行计划)关键字是什么?
简介: explain是一个强大的 SQL 命令,用于分析和优化查询性能。通过查看数据库执行计划,我们可以理解查询是如何被处理的,包括表的访问顺序、使用的索引、连接类型等。这对于找到潜在的性能瓶颈非常重要。 目录 一、基本含义 二…...

Mybatis两种方式来调用sql语句
使用Mybatis时,有两种方式来调用sql语句: 方式一(直接通过Session对象调用sql语句): SqlSession sqlSession sqlSessionFactory.openSession(); User user sqlSession.selectOne("userTest.selectUser"…...

第十八节:学习统一异常处理(自学Spring boot 3.x的第五天)
这节记录下如何通过AOP方式统一处理异常拦截。 第一步: 新建一个exception包,创建一个ExcetionHandler.java(名字随意取) package cn.wcyf.wcai.exception;import cn.wcyf.wcai.common.Result; import org.springframework.web…...

flink中slotSharingGroup() 的详解
在 Apache Flink 中,slotSharingGroup() 是一个用于控制算子(operator)之间资源共享的机制。它允许多个算子共享相同的 slot(即资源容器)。Slot 是 Flink 中的资源单位,slot 共享可以提高资源利用率&#x…...

ASPF 技术介绍
...

77-java 装饰器模式和适配器模式区别
Java中的装饰器模式和适配器模式虽然都涉及到对象的组合和包装,但它们的应用场景和目的有所不同。 装饰器模式的目的是在不修改原始对象的基础上,动态地添加功能或行为。它允许用户通过创建一个包含原始对象的包装类(装饰器ÿ…...

5. Fabric 设置画布大小
1. 设置宽度 canvas.setWidth(width)2. 设置高度 canvas.setHeight(height)3. 设置大小 canvas.setDimensions({width,height })4. 画布的缩放 canvas.on(mouse:wheel, (opt) > {const delta opt.e.deltaY // 滚轮,向上滚一下是 -100,向下滚一下…...

240912-通过Ollama实现网站知识总结
A. 最终效果 B. 准备工作 报错: USER_AGENT environment variable not set, consider setting it to identify your requests.-CSDN博客 C. 完整代码 # https://coreyclip.github.io/Ollama-Web-Summaries/import os os.environ[USER_AGENT] Mozilla/5.0 (Windows NT 10.…...

Debian 包管理工具apt使用
apt基本用法 apt(Advanced Package Tool)是Debian及其衍生发行版(如Ubuntu、Linux Mint等)中非常强大的软件包管理系统。它允许用户从远程仓库安装、更新、升级、配置和卸载软件包。除了我们已经讨论过的卸载软件包的功能外&…...