多台云服务器的 Kubernetes 集群搭建

article/2025/9/15 21:31:26

环境

两台或多台腾讯云服务器(本人搭建用了两台),都是 CentOs 7.6,

master 节点:服务器为 4C8G,公网 IP:124.222.61.xxx

node1节点:服务器为 4C4G,公网 IP:101.43.182.xxx

修改 hosts 信息:

在 master 节点和 node 节点的 hosts 文件中添加节点信息

$ vim /etc/hosts
124.222.61.xxx master
101.43.182.xxx node1

这里的 master 和 node1 均为 hostname,尽量不要使用默认的 hostname,修改hostname的命令为 hostnamectl set-hostname master

禁用防火墙:

$ systemctl stop firewalld
$ systemctl disable firewalld

禁用 SELINUX:

$ vim /etc/selinux/config
SELINUX=1
$ setenforce 0
$ vim /etc/selinux/config
SELINUX=disabled

加载 br_netfilter 模块:

$ modprobe br_netfilter

创建/etc/sysctl.d/k8s.conf文件:

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

执行命令使修改生效:

$ sysctl -p /etc/sysctl.d/k8s.conf

安装 ipvs:

$ cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
$ chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

在各个节点上都安装 ipset:

$ yum install ipset

安装管理工具 ipvsadm:

$ yum install ipvsadm

同步服务器时间:

$ yum install chrony -y
$ systemctl enable chronyd
$ systemctl start chronyd

关闭 swap 分区:

$ swapoff -a
$ vim /etc/sysctl.d/k8s.conf
(添加一行)vm.swappiness=0
$ sysctl -p /etc/sysctl.d/k8s.conf

安装 Docker:

$ yum install -y yum-utils \device-mapper-persistent-data \lvm2
$ yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo (阿里云镜像)
$ yum install docker-ce-18.09.9

配置 Docker 镜像加速器(阿里云):

$ mkdir -p /etc/docker
$ vim /etc/docker/daemon.json
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors" : ["https://uvtcantv.mirror.aliyuncs.com"]
}

启动 Docker:

$ systemctl start docker
$ systemctl enable docker

安装 Kubeadm:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

然后安装 kubeadm、kubelet、kubectl:

$ yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 --disableexcludes=kubernetes

设置成开机自启动:

$ systemctl enable --now kubelet

上面的所有操作都需要在所有的节点进行配置

集群初始化

在 master 节点配置 kubeadm 初始化文件:

$ kubeadm config print init-defaults > kubeadm.yaml

修改 kubeadm.yaml 文件,修改 imageRepository ,kube-proxy 的模式为 ipvs,networking.podSubnet 设置为10.244.0.0/16

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 124.222.61.xxx  # apiserver master节点IPbindPort: 6443
nodeRegistration:criSocket: /var/run/dockershim.sockname: master  # 默认读取当前master节点的hostnametaints:- effect: NoSchedulekey: node-role.kubernetes.io/master
---
apiServer:timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:type: CoreDNS
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers  # 修改成阿里云镜像源
kind: ClusterConfiguration
kubernetesVersion: v1.16.2
networking:dnsDomain: cluster.localpodSubnet: 10.244.0.0/16  # Pod 网段,flannel插件需要使用这个网段serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs  # kube-proxy 模式

然后使用上面的配置文件进行初始化:

$ kubeadm init --config kubeadm.yaml

初始化这里有个坑,执行完上面的初始化脚本后会卡在 etcd 初始化的位置,因为 etcd 绑定端口的时候使用外网 IP,而云服务器外网 IP 并不是本机的网卡,而是网关分配的一个供外部访问的 IP,从而导致初始化进程一直重试绑定,长时间卡在这里[kubelet-check] Initial timeout of 40s passed.

解决办法,在卡住的时候另启一个服务器终端,修改初始化生成的 etcd.yaml

vim /etc/kubernetes/manifests/etcd.yaml

将其修改成这样:

耐心等待三到四分钟就可以了。

初始化成功之后,会在终端打印一条命令,这条命令就是节点加入集群要执行的命令如下图:

拷贝 kubeconfig 文件:

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

添加节点

将 master 节点上的 $HOME/.kube/config 文件拷贝到 node 节点$HOME/.kube/config对应的文件中

然后执行上面 master 节点初始化生成的命令,如果忘了可以执行kubeadm token create --print-join-command重新获取。

kubeadm join 124.222.61.161:6443 --token 1l2un1.or6f04f1rewyf0xq     --discovery-token-ca-cert-hash sha256:1534171b93c693e6c0d7b2ed6c11bb4e2604be6d2af69a5f464ce74950ed4d9d

执行成功后运行kubectl get nodes命令:

$ kubectl get nodes
执行之后可以看到 status 是 NotReady 状态,因为我们还没安装网络插件

安装 flannel 网络插件:

$ wget  https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
$ vi kube-flannel.yml
......
containers:
- name: kube-flannelimage: quay.io/coreos/flannel:v0.11.0-amd64command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgr- --iface=eth0  # 如果是多网卡的话,指定内网网卡的名称
......
$ kubectl apply -f kube-flannel.yml

等待一段时间查看 Pod 运行状态:

$ kubectl get pods -n kube-system
NAME                                  READY   STATUS    RESTARTS   AGE
coredns-58cc8c89f4-6nn74              1/1     Running   0          18h
coredns-58cc8c89f4-v96jb              1/1     Running   0          18h
etcd-ydzs-master                      1/1     Running   0          18h
kube-apiserver-ydzs-master            1/1     Running   2          18h
kube-controller-manager-ydzs-master   1/1     Running   0          18h
kube-flannel-ds-amd64-674zs           1/1     Running   0          18h
kube-flannel-ds-amd64-zbv7l           1/1     Running   0          18h
kube-proxy-b7c9c                      1/1     Running   0          18h
kube-proxy-bvsrr                      1/1     Running   0          18h
kube-scheduler-ydzs-master            1/1     Running   0          18h

查看 node 节点,发现也正常了:

$ kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   18h   v1.16.2
node1    Ready    <none>   18h   v1.16.2

配置 Dashboard

$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta5/aio/deploy/recommended.yaml
$ vi recommended.yaml
# 修改Service为NodePort类型
......
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443selector:k8s-app: kubernetes-dashboardtype: NodePort  # 加上type=NodePort变成NodePort类型的服务
......
$ kubectl apply -f recommended.yaml

Dashboard 会被默认安装在 kubernetes-dashboard 这个命名空间下面:

$ kubectl get pods -n kubernetes-dashboard -l k8s-app=kubernetes-dashboard
NAME                                    READY   STATUS    RESTARTS   AGE
kubernetes-dashboard-6b86b44f87-xsqft   1/1     Running   0          16h
$ kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.100.126.111   <none>        8000/TCP        17h
kubernetes-dashboard        NodePort    10.108.217.144   <none>        443:31317/TCP   17h

然后我们通过https://124.222.61.161:31317访问,会发现访问失败,因为证书过期了下面我们来生成证书:

#新建目录:
mkdir key && cd key#生成证书
openssl genrsa -out dashboard.key 2048 #我这里写的自己的node1节点,因为我是通过nodeport访问的;如果通过apiserver访问,可以写成自己的master节点ip
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=124.222.61.161'
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt #删除原有的证书secret
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard#创建新的证书secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard#查看pod
kubectl get pod -n kubernetes-dashboard#重启pod
kubectl delete pod kubernetes-dashboard-7b5bf5d559-gn4ls  -n kubernetes-dashboard

执行完继续访问会提示不安全连接,继续访问就好了。

这里我们使用火狐浏览器,Google 浏览器无法访问

创建用户登陆 Dashboard:

# 创建 admin.yaml 文件
$ vim admin.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: adminannotations:rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:kind: ClusterRolename: cluster-adminapiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccountname: adminnamespace: kubernetes-dashboard---
apiVersion: v1
kind: ServiceAccount
metadata:name: adminnamespace: kubernetes-dashboard# 直接创建
$ kubectl apply -f admin.yaml
$ kubectl get secret -n kubernetes-dashboard|grep admin-token
admin-token-jv2dq                  kubernetes.io/service-account-token   3      16h
kubectl get secret admin-token-jv2dq -o jsonpath={.data.token} -n kubernetes-dashboard |base64 -d
# 会生成一串很长的base64后的字符串

然后用上面的 base64 的字符串作为 token 登录 Dashboard 即可:


http://chatgpt.dhexx.cn/article/KkAKVt6s.shtml

相关文章

基于slurm框架的GPU服务器集群搭建方法

基于slurm框架的GPU服务器集群搭建操作文档 1. 环境基础 2. 环境配置 2.1 hostname配置 2.2 关闭SELinux &#xff08;master, slave&#xff09; 2.3 关闭Firewall &#xff08;master, slave&#xff09; 2.4 配置ip与hostname映射关系 (master, slave1) 3. 创建munge和…

Tomcat服务器集群搭建

Tomcat服务器集群与负载均衡 一、前言 在单一的服务器上执行WEB应用程序有一些重大的问题&#xff0c;当网站成功建成并开始接受大量请求时&#xff0c;单一服务器终究无法满足需要处理的负荷量&#xff0c;所以就有点显得有 点力不从心了。另外一个常见的问题是会产生单点故障…

Hadoop分布式集群搭建完整版(持续更新中)

1.前期准备工作 各类软件以及工具包下载 2.网络环境配置 2.1 打开 VMware 找到编辑&#xff0c;点击虚拟网络配置 2.2 点击第二行&#xff0c;然后更改设置 2.3 点击第三行VMnet8&#xff0c;把本地DHC服务将IP地址分配给虚拟机取消&#xff0c;配置子网&#xff0c;子网掩码&a…

保姆级教学——集群环境搭建及创建集群

保姆级教学——集群环境搭建及创建集群 新建虚拟机 一些默认&#xff0c;加载镜像开启虚拟机&#xff0c;在安装位置选择自己目录&#xff0c;然后建立分区&#xff0c;首先添加 挂载点&#xff0c;类型标准分区&#xff0c;文件系统ext4 加载分区&#xff0c;期望给2G, 类…

集群搭建完整版

集群搭建完整版 1.集群搭建的准备工作 1.克隆虚拟机 &#xff08;要三台&#xff0c;创建一台 JDK、Hadoop 都安装完成的虚拟机&#xff0c;看 1.1 和 1.2&#xff09; 2. 修改克隆虚拟机的静态 IP vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICEeth0 TYPEEthernet ON…

搭建服務器集群【3大注意事項】

简述 服务器集群是现时很多企业选用的建站科案选用技术, 为企业提供更稳定可靠的运作, 服务器出现超载或宕机也不会导致整个业务无法运作, 是企业服务器热备的不二之选, 我们为你一一说明一下 什么是服务器集群&#xff1f; 服务器集群指多台服务器集合及共同管理一个业务, …

通过vnc自动连接linux,通过VNC连接Linux远程桌面

因为特殊的需求关系&#xff0c;琢磨了一下如何在本地连接远程Linux主机的桌面环境。翻了不少网上的相关文章&#xff0c;大部分都只讲了步骤没有说为什么这么做&#xff0c;我就简单再复述一遍吧&#xff0c;加深一下印象。 环境如下&#xff1a; 本地&#xff1a;OS X 10.8.2…

Linux和Windows间的远程桌面访问

在Windows上面&#xff0c;我们都用过系统自带的远程桌面连接或者TeamViewer这样的工具&#xff0c;可以方便的让我们用图形化方式远程操作其他计算机。但是在Linux上&#xff0c;我们一般都是使用SSH来操作终端。那么在Linux上有没有一些工具可以让我们像Windows那样用图形化的…

Linux远程桌面初体验——todesk、向日葵终极对决

文章目录 前言一、使用环境及软件介绍二、使用步骤总结 前言 大家都知道&#xff0c;Linux桌面的功能很少被人使用&#xff0c;但目前包括但不限于红帽系的发行版本慢慢开始重视桌面环境&#xff0c;尤其是国产操作系统。今天我就来大家看一下国产操作系统下远程桌面的使用体验…

linux远程桌面连接

rdesktop这个软件 sudo apt-get install rdesktoprdesktop -g 1366*768 -P -z -x l -r sound:off -u username 192.168.123.5参数意义-g后面代表要使用的分辨率-P启用位图缓存-z启用RDP数据流压缩-x l使用局域网级别的图像质量-r sound:off关闭声音-u windowuser指定要使用的用…

Linux 远程桌面实现

硬件环境&#xff1a;树莓派3B 操作系统&#xff1a; Raspberry Jessie 安装xrdp服务&#xff08;属于tightVNC服务的一部分&#xff09; sudo apt-get install xrdp 安装完成后&#xff0c;输入如下命令&#xff1a; sudo /etc/init.d/xrdp start sudo update-rc.d xrdp de…

Linux配置VNC远程桌面

环境&#xff1a;CentOS7 VNC需要系统安装的有桌面&#xff0c;如果是生产环境服务器&#xff0c;安装时使用的最小化安装&#xff0c;那么进行下面操作按章GNOME 桌面。 # 列出的组列表里有GNOME Desktop。 yum grouplist #安装之 yum groupinstall -y "GNOME Desktop&…

如何远程linux服务器桌面,LINUX操作系统如何远程登录桌面

相比window来说linux远程桌面登陆需要第三方软件来实现&#xff0c;之前用ssh登陆的都是字符界面;昨天试了试远程桌面也是可以的&#xff0c;方法很多&#xff0c;这儿只阐述比较好用的一种;使用时&#xff0c;关闭windows防火墙&#xff0c;或者开启相应的防火墙端口;这里使用…

linux远程桌面rdesktop,Linux下通过rdesktop连接Windows远程桌面

rdesktop是linux下支持Windows远程桌面连接的客户端程序,在linux系统下可通过它远程访问Windows桌面,支持多种版本。rdesktop是sourceforge下支持GPL协议的一个开源项目,采用RDP(Remote Desktop Protocol,远程桌面协议),几乎可以连接windows的所有版本,诸如NT 4 Terminal …

red hat linux 远程,Red Hat Linux 远程桌面 – 如何设置

远程访问 RHEL 计算机。运行 RHEL 7.3-8.1 的 Linux 计算机的远程桌面。从任何计算机、平板电脑或移动设备进行访问。立即免费试用&#xff01; 如果您是在家中或在旅途中工作&#xff0c;则可能需要一段时间才能在办公室或在家中访问台式计算机。如果该桌面恰巧在 Linux 操作系…

linux系统开远程桌面,Linux 系统开启远程桌面的方法

Linux操作系统开启远程桌面的方法 一、组网需求: 我司iMC不仅支持Windows系统环境下的安装部署,还支持Linux系统环境下的安装部署,在定位网上问题或者远程安装部署时,远程桌面是一种快捷的方法,Windows操作系统下开启远程桌面的方法众所周知,下面介绍开启Linux操作系统远…

vnc连接linux远程桌面

文章目录 1, centos6安装vnc服务端vnc常用命令设置vnc随机登录密码设置ssh 密钥文件登录&#xff1a;禁止密码登录 2, ubuntu安装vnc服务端3, windows 安装vncviewer客户端 1, centos6安装vnc服务端 # 1, install vncserver yum -y install epel-release yum -y install vnc-s…

linux远程桌面连接_如何从Linux连接到远程桌面

linux远程桌面连接 根据Wikipedia的说法, 远程桌面是“一种软件或操作系统功能,它允许个人计算机的桌面环境在一个系统(通常为PC,但该概念同样适用于服务器)上远程运行,同时显示在服务器上。单独的客户端设备。” 换句话说,远程桌面用于访问另一台计算机上运行的环境。…

linux的远程桌面服务配置

一、 实验题目 Linux的远程桌面服务配置 二、 理论分析 Xrdp是一个开源工具,允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP之外,xrdp工具还接受来自其他RDP客户端的连接,如FreeRDP,rdesktop和NeutrinoRDP。 Xrdp现在支持TLS安全层。 XFCE是一个桌面环境&#…

查看java编程环境是否配置成功

验证Java编程环境是否配置成功 点击键盘Windowsr键&#xff0c;打开运行提示框输入cmd按回车键打开命令框 输入javac&#xff0c;点击回车&#xff0c;查看java编译环境是否正常。 输入“java”&#xff0c;点击回车&#xff0c;查看java运行环境是否正常。 输入java -versi…