centos7虚拟机搭建k8s集群

本文详细介绍了如何在CentOS7环境下搭建Kubernetes集群,包括环境准备、安装Docker、设置kubelet、kubeadm、kubectl,主节点初始化,工作节点加入集群的步骤。此外,还提到了网络插件Calico的安装以及Kubernetes Dashboard的部署。整个过程涉及网络配置、服务启动、节点状态检查等关键操作。

一、环境准备

准备3台虚拟机,版本为centos7,我这里ip分别为 192.168.133.10、192.168.133.11、192.168.133.12,三台虚拟机的hostname分别设置为k8s-masterk8s-node1k8s-node2,这样看起来直观一点。可通过hostnamectl set-hostname xxxx来设置hostname,设置完成后,重新连接虚拟机即可。

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

#关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab

二、安装docker

1、安装docker

卸载旧版本,如果没有安装则可不执行

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安装docker

# 安装yum-utils以支持yum-config-manager模块
yum install -y yum-utils
# 配置阿里云节点加速
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker,指定版本号,避免后面与k8s冲突
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7  containerd.io-1.4.6

设置docker开机自启

systemctl enable docker --now

2、配置docker镜像加速

mkdir -p /etc/docker


tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://i2ovbgkg.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

重启docker

systemctl daemon-reload
systemctl restart docker

三、安装kubelet、kubeadm、kubectl

1、网络设置

#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

2、配置阿里云k8s加速

cat <<EOF | sudo tee /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.gpg
   http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

3、安装指定版本

yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

4、设置kubelet开机自启

systemctl enable --now kubelet

5、设置集群端点host

echo "192.168.133.10  cluster-endpoint" >> /etc/hosts

注:以上的设置适用于所有的虚拟机


四、主节点初始化

这里的命令只适用于master节点

kubeadm init \
--apiserver-advertise-address=192.168.133.10 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16

上面的命令只需要在主节点执行,执行可能会比较慢,等待几分钟即可。至于service-cidr以及pod-network-cidr,暂时还没时间去弄懂为啥要这么写。

执行完成后会打印如下的信息,先记下来

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join cluster-endpoint:6443 --token mjcoa7.jq71xluq54aa6tmf \
    --discovery-token-ca-cert-hash sha256:c4c8f5380d80d30bca71534ae0228ef5025a0f47dc5f5cd31a5ec795e039b91e \
    --control-plane 

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join cluster-endpoint:6443 --token mjcoa7.jq71xluq54aa6tmf \
    --discovery-token-ca-cert-hash sha256:c4c8f5380d80d30bca71534ae0228ef5025a0f47dc5f5cd31a5ec795e039b91e

而在这上面还打印了一些需要我们执行的命令,首先是,如果要使用集群,则需要执行一些命令,如果是普通用户,则执行

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

如果是root用户,则执行下面的命令,因为我是用的root用户,所以执行这个命令

export KUBECONFIG=/etc/kubernetes/admin.conf

上面的信息中还提示我们需要部署一个pod网络插件,如果不安装这个网络插件,集群是用不了的,可以使用kubectl get nodes命令来看下集群信息,打印如下

NAME         STATUS     ROLES                  AGE   VERSION
k8s-master   NotReady   control-plane,master   43m   v1.20.9

从上面看到,只有一个节点,且状态还是NotReady,原因就是未安装pod网络节点,接下来就去安装网络插件。

从提示信息中可以看到,网络插件的安装,官网有文档:https://kubernetes.io/docs/concepts/cluster-administration/addons/,打开这个链接,可以看到k8s支持很多的网络插件,我们这里选择Calico,安装文档参考官网:https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico-with-kubernetes-api-datastore-more-than-50-nodes

curl https://docs.projectcalico.org/manifests/calico.yaml -O

kubectl apply -f calico.yaml

等一下再使用kubectl get nodes命令查看节点状态,已经是Ready

从上面的信息中看到,如果需要将主节点加入到集群,只需要执行

kubeadm join cluster-endpoint:6443 --token mjcoa7.jq71xluq54aa6tmf \
    --discovery-token-ca-cert-hash sha256:c4c8f5380d80d30bca71534ae0228ef5025a0f47dc5f5cd31a5ec795e039b91e \
    --control-plane 

而如果是需要将工作节点加入到集群,则执行

kubeadm join cluster-endpoint:6443 --token mjcoa7.jq71xluq54aa6tmf \
    --discovery-token-ca-cert-hash sha256:c4c8f5380d80d30bca71534ae0228ef5025a0f47dc5f5cd31a5ec795e039b91e

可以看到,主节点就比工作节点多了个--control-plane,其他都一样

下面是几个常用k8s命令

#查看集群所有节点
kubectl get nodes

#根据配置文件,给集群创建资源
kubectl apply -f xxxx.yaml

#查看集群部署了哪些应用?
docker ps   ===   kubectl get pods -A
# 运行中的应用在docker里面叫容器,在k8s里面叫Pod
kubectl get pods -A

五、工作节点加入集群

在上面的步骤中,我们将部分提示信息复制了出来,其中就有工作节点加入集群的命令。分别在node1和node2中执行如下命令即可将这两个节点加入集群

kubeadm join cluster-endpoint:6443 --token mjcoa7.jq71xluq54aa6tmf \
    --discovery-token-ca-cert-hash sha256:c4c8f5380d80d30bca71534ae0228ef5025a0f47dc5f5cd31a5ec795e039b91e

命令执行后,打印如下的提示信息即说明加入集群成功了

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

根据提示信息,我们到master节点中执行kubectl get nodes即可查看节点信息,若节点状态不是Ready,则稍等一会儿即可。

# 查看运行中的pod,相当于docker ps,需要在master节点中执行
kubectl get pod -A
# 阻塞查看
kubectl get pod -A -w

特别说明,加入集群的token有效期是24小时,token过期后若有新的节点需要加入到集群中,则需要在master中重新生成新的token

kubeadm token create --print-join-command

如果加入时命令错了,或者主节点挂了需要重新安装,这时候需要重新加入怎么办?

https://blog.youkuaiyun.com/weixin_44953658/article/details/112094391

1、重置kubeadm reset

2、重新加入

六、自修复能力测试

将任意机器重启,重启过程中,在master节点中使用命令watch -n 1 kubectl get pods -A观察各个pod的状态,可以发现,最终都会变为running。

七、安装k8s可视化界面dashboard

安装方式参照官方github地址:https://github.com/kubernetes/dashboard

# 安装图形化界面
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

编辑dashboard的svc,对应命名空间(-n)是kubernetes-dashboard

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

需要修改的内容:将spec下的type由ClusterIP改为NodePort,为的是将dashboard的端口暴露出去

上面的行不通,参考下面的https://blog.youkuaiyun.com/mshxuyi/article/details/108425487

使用kubectl get svc -A命令查看服务

$ kubectl get svc -A
NAMESPACE              NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
default                kubernetes                  ClusterIP   10.96.0.1       <none>        443/TCP                  5h52m
kube-system            kube-dns                    ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   5h52m
kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.96.137.165   <none>        8000/TCP                 85s
kubernetes-dashboard   kubernetes-dashboard        ClusterIP   10.96.131.136   <none>        443/TCP                  85s

dashboard 服务的类型是ClusterIP,不便于我们通过浏览器访问,因此需要改成NodePort型的

# 查看服务信息
$ kubectl get svc kubernetes-dashboard -n kubernetes-dashboard
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.96.131.136   <none>        443/TCP   22m

删除现有的dashboard服务

kubectl delete service kubernetes-dashboard --namespace=kubernetes-dashboard

创建配置文件

vim dashboard-svc.yaml

文件内容如下

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

根据配置文件创建服务

kubectl apply -f dashboard-svc.yaml

接下来需要创建访问用户

新建配置文件

vim dashboard-svc-account.yaml

文件内容如下

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: dashboard-admin
subjects:
  - kind: ServiceAccount
    name: dashboard-admin
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

执行,根据配置文件创建用户

kubectl apply -f dashboard-svc-account.yaml

获取token

执行

kubectl get secret -n kube-system |grep admin|awk '{print $1}'

会打印一行数据dashboard-admin-token-xxxxx,接下来获取token

kubectl describe secret dashboard-admin-token-xxxxx -n kube-system|grep '^token'|awk '{print $2}'

打印的结果就是token,很长,复制出来,登录时需要用到

登录地址:https://master_ip:port,端口可通过kubectl get svc kubernetes-dashboard -n kubernetes-dashboard查看


参考

https://www.yuque.com/leifengyang/oncloud/ghnb83#SDlhV

### 使用 VMware 克隆虚拟机构建 Kubernetes (k8s) 集群 构建 Kubernetes (k8s) 集群可以通过 VMware 虚拟化技术实现高效管理。以下是关于如何通过 VMware 克隆虚拟机并配置 k8s 集群的具体方法。 #### 1. 准备工作 在另一台主机上安装 VMware 并完成虚拟机的准备工作,包括创建主节点 `master` 和克隆从节点 `node1` 的操作[^1]。随后将这些虚拟机文件复制到目标主机,并重命名为 `node2` 和 `node3` 后加载至 VMware 中运行。 #### 2. 安装必要的系统工具 为了支持后续 Dockerk8s 组件的正常运作,需提前安装一些基础依赖项。具体命令如下所示: ```bash yum install -y yum-utils device-mapper-persistent-data lvm2 ``` 此步骤确保操作系统具备所需的存储管理和包处理能力[^2]。 #### 3. 设置静态 IP 地址 针对各节点分别设定固定的网络参数以便于集群内部通信稳定可靠。例如: - Master 节点 IP: 172.31.0.3 - Node01 节点 IP: 172.31.0.4 - Node02 节点 IP: 172.31.0.5 子网掩码统一设为 255.255.0.0 ,默认路由指向网关地址 172.31.0.2 。同时指定公共 DNS 解析服务器地址为 114.114.114.114 [^4]。 #### 4. 安装与初始化 Docker 环境 Docker 是一种容器引擎服务,其核心理念在于提供轻量化、共享宿主机内核资源的方式创建独立的应用执行空间即所谓“容器”。相较于传统意义上的完全型虚拟机而言更加节省计算资源开销[^3]。对于即将部署 K8S 架构来说至关重要因为 Pod 实际上是由多个关联紧密的 Container 所组成而后者正是基于前者之上进一步封装而来。 执行以下脚本以自动化方式引入最新版本镜像仓库源列表以及实际二进制程序本身: ```bash # 添加官方推荐国内加速站点作为远程索引位置 cat <<EOF | sudo tee /etc/yum.repos.d/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 EOF # 开始正式获取软件包及其对应组件 sudo yum makecache fast && \ sudo yum -y install docker-ce docker-ce-cli containerd.io # 修改 daemon.json 文件启用 cgroupfs driver 类型驱动模式适配 kubelet 默认需求 mkdir -p /etc/docker/ echo '{"exec-opts": ["native.cgroupdriver=cgroupfs"]}' > /etc/docker/daemon.json systemctl enable --now docker.service ``` #### 5. 初始化 Kubernetes 控制平面 利用 kubeadm 工具简化整个过程中的复杂度从而快速启动初始状态下的 master server : ```bash swapoff -a # 关闭交换分区防止影响调度策略判断逻辑准确性 modprobe br_netfilter # 加载桥接模块允许跨不同 namespace 层次间数据转发行为发生 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<Master_IP> ``` 完成后记录下提示信息里的 join token 字符串留待稍后扩展 worker nodes 连入时调用验证身份合法性之用途。 #### 6. 应用 CNI 插件定义网络拓扑结构 下载 Flannel 或 Calico 等第三方插件 YAML 清单文档并通过 apply 命令提交给 API Server 处理形成完整的 overlay networking framework 支撑业务 pod 相互通信无障碍: ```bash kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` 等待几分钟直到所有 core components 显示 Running status 即可认为成功搭建完毕初步可用形态的基础架构体系框架雏形出来了! ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值