Centos7.9部署k8s(详细步骤)

Kubernetes 简介:容器编排的王者

什么是 Kubernetes?​

Kubernetes(通常简称为 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。

  • 核心思想​:它提供了一个框架,让你能够以"集群"的方式运行和协调分布式系统的多个容器,并轻松实现服务的滚动更新、故障自愈和负载均衡。

  • 起源​:由 Google 设计并开源,其积累了大量大规模运行容器的经验。

为什么需要 Kubernetes?容器时代的挑战

在没有编排工具之前,管理大量的 Docker 容器就像手动管理一个庞大的舰队,非常困难。

Kubernetes 就像这个舰队的总指挥和自动化控制塔,它解决了以下核心问题:

  • 服务发现与负载均衡​:如何让一个容器找到另一个容器?如何将流量分发给多个副本?

  • 存储编排​:如何为容器挂载存储卷?

  • 自动发布与回滚​:如何无缝更新应用而不导致服务中断?

  • 自我修复​:当容器挂掉时,如何自动重启它?当节点故障时,如何将上面的容器迁移到健康节点?

  • 密钥与配置管理​:如何安全地管理密码、密钥等敏感信息?

核心架构:Master 与 Node

一个 K8s 集群由一组节点(机器)组成,分为两种角色:​控制平面(Master)​ ​ 和 ​工作节点(Node)​

  • 控制平面 (Master) - 大脑

    • 负责管理整个集群,做出全局决策(如调度、检测和响应集群事件)。

    • 主要组件:kube-apiserver(API入口)、etcd(集群状态数据库)、kube-scheduler(调度器)、kube-controller-manager(控制器管理器)。

  • 工作节点 (Node) - 肢体

    • 负责运行容器化应用。

    • 每个节点上都有:kubelet(与Master通信的代理)、kube-proxy(网络代理)、容器运行时​(如 Docker、containerd)。

核心概念与工作模型:Pod

K8s 不直接管理单个容器,它的最小调度和部署单元是 ​Pod

  • Pod ​:一个 Pod 是一个或多个共享网络和存储的容器组。它们总是被共同调度和部署在同一个节点上。可以把 Pod 想象成一个"逻辑主机",里面运行着关系紧密的容器(比如一个主应用容器和一个日志收集 sidecar 容器)。

5. 如何管理 Pod?常用工作负载资源

我们很少直接创建独立的 Pod,而是通过更高级的控制器(Controller)​​ 来管理它们,以实现期望的状态。

  • Deployment ​:​最常用!​​ 用于部署无状态应用。它可以轻松实现应用的滚动更新、回滚和多副本扩展。

  • Service​:为一组功能相同的 Pod(通常由 Deployment 管理)提供一个稳定的网络访问入口(IP地址和DNS名称),并实现负载均衡。

  • Ingress​:管理集群外部访问服务的规则,通常提供 HTTP/HTTPS 路由、SSL 终止等功能,是更高级的"服务网关"。

  • ConfigMap & Secret​:分别用于将配置数据和敏感信息(如密码)与容器镜像解耦,实现配置的灵活管理。


总结

Kubernetes 已经成为云原生时代的操作系统,它提供了强大的自动化能力,让开发者和运维人员能够轻松地在大规模分布式环境中构建、部署和维护应用程序。从简单的 Web 服务到复杂的微服务架构,K8s 都能提供坚实的基础设施支持。

环境准备:

|-----------|----------------|------------|
| 系统 | IP | 角色 |
| centos7.9 | 172.16.106.135 | k8s-master |
| centos7.9 | 172.16.106.136 | k8s-node1 |
| centos7.9 | 172.16.106.138 | k8s-node2 |

设置主机名

在172.16.106.135执行

复制代码
hostnamectl set-hostname k8s-master && bash

在172.16.106.136执行

复制代码
hostnamectl set-hostname k8s-node1 && bash

在172.16.106.138执行

复制代码
hostnamectl set-hostname k8s-node2 && bash

关闭防火墙

三台机器执行如下命令关闭防火墙

复制代码
systemctl stop firewalld #临时关闭
systemctl disable firewalld #永久关闭

关闭selinux

三台机器执行如下命令关闭selinux

复制代码
setenforce 0 #临时关闭

vim /etc/selinux/config #永久关闭
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled  #改为disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

关闭swap分区

三台机器执行如下命令关闭swap分区

复制代码
swapoff -a #临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭

添加hosts

在三台机器执行如下命令添加hosts

复制代码
sudo cat << EOF >> /etc/hosts
172.16.106.135 k8s-master
172.16.106.136 k8s-node1
172.16.106.138 k8s-node2
EOF

ipv4流量传递

在三台机器执行如下命令将ipv4流量传递到iptables的链

复制代码
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF


sysctl --system #执行后生效

配置可用yum源

在三台机器执行如下配置yum源

复制代码
cd /etc/yum.repos.d/ #进入此目录
rm -rf /etc/yum.repos.d/* #删除无用源


#wegt 拉取我们需要的yum源
wget -O /etc/yum.repos.d/centos7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum clean all #清理yum缓存
yum makecache #建立元数据缓存

安装docker

在三台机器执行如下命令安装docker

复制代码
yum install -y docker-ce-20.10.16-3.el7 docker-ce-cli-20.10.16-3.el7 containerd.io

在三台机器执行如下命令启动docker和开机自启

复制代码
systemctl start docker #启动
systemctl enable docker #开机自启

安装k8s

在三台机器上执行如下命令配置k8s源

复制代码
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

在三台机器上执行如下命令安装k8s

复制代码
yum install -y kubelet-1.22.2 kubeadm-1.22.2 kubectl-1.22.2 

systemctl start kubelet #启动
systemctl enable kubelet #开机自启

配置docker镜像源

在三台机器执行如下命令添加docker镜像加速源

复制代码
sudo mkdir -p /etc/docker 
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  }
}
EOF

sudo systemctl daemon-reload #重新载入
sudo systemctl restart docker 
sudo systemctl enable docker

创建master节点

在master节点执行如下命令

复制代码
kubeadm init \
--apiserver-advertise-address=172.16.106.135 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.2 \
--control-plane-endpoint k8s-master \
--service-cidr=172.16.0.0/16 \
--pod-network-cidr=10.244.0.0/16


#注意172.16.106.135 换成你实际master ip 即可

执行完上面命令后会有以下输出

复制代码
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 k8s-master:6443 --token kc162j.fb0xi065kd07o2w6 \
        --discovery-token-ca-cert-hash sha256:26efadd65956d56720d09850df8720b3087ca78b2d7510fedf53ddc26e907fc8 \
        --control-plane

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

kubeadm join k8s-master:6443 --token kc162j.fb0xi065kd07o2w6 \
        --discovery-token-ca-cert-hash sha256:26efadd65956d56720d09850df8720b3087ca78b2d7510fedf53ddc26e907fc8

以下三条在master节点运行

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

这里需要注意以下代码是后面我们工作节点加入集群所需要的 也就是要在工作节点执行(保留好,现在不需要执行)

复制代码
kubeadm join k8s-master:6443 --token kc162j.fb0xi065kd07o2w6 \
        --discovery-token-ca-cert-hash sha256:26efadd65956d56720d09850df8720b3087ca78b2d7510fedf53ddc26e907fc8

在三台机器上执行如下命令来拉取网络插件镜像

复制代码
docker pull quay.io/coreos/flannel:v0.14.0

在master上执行如下命令来获取官方的yml文件,并创建pod

复制代码
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kubectl apply -f kube-flannel.yml 

工作节点加入集群

此时我们在两个工作节点执行上面的代码来加入集群

复制代码
kubeadm join k8s-master:6443 --token kc162j.fb0xi065kd07o2w6 \
        --discovery-token-ca-cert-hash sha256:26efadd65956d56720d09850df8720b3087ca78b2d7510fedf53ddc26e907fc8

此时集群基础配置已经完成,可以执行如下命令查看集群状态

复制代码
kubectl get nodes


[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   16h   v1.22.2
k8s-node1    Ready    <none>                 15h   v1.22.2
k8s-node2    Ready    <none>                 15h   v1.22.2

全部为Ready状态。

工作节点加标签

在master执行如下命令来给工作节点加上标签

复制代码
kubectl label nodes k8s-node1 node-role.kubernetes.io/worker=  #给node1添加标签

kubectl label nodes k8s-node2 node-role.kubernetes.io/worker=  #给node2添加标签



再次执行kebuctl get nodes 查询

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   16h   v1.22.2
k8s-node1    Ready    worker                 15h   v1.22.2
k8s-node2    Ready    worker                 15h   v1.22.2
节点标签已经变为worker

k8s常用命令

下面我列出一下k8s常用命令,因为命令较多我就不一一列出了

复制代码
# 集群信息
kubectl cluster-info                          # 显示集群基本信息
kubectl version                               # 显示客户端和服务器版本
kubectl get nodes                             # 查看所有节点状态
kubectl get nodes -o wide                     # 查看节点详细信息(包括IP等)
kubectl describe node <node-name>             # 查看某个节点的详细描述

# 命名空间操作
kubectl get namespaces                        # 查看所有命名空间
kubectl create namespace <namespace-name>     # 创建命名空间
kubectl delete namespace <namespace-name>     # 删除命名空间

# Pod管理
kubectl get pods                              # 查看默认命名空间的Pod
kubectl get pods -n <namespace>               # 查看指定命名空间的Pod
kubectl get pods -A                           # 查看所有命名空间的Pod
kubectl describe pod <pod-name>               # 查看Pod详细描述
kubectl logs <pod-name>                       # 查看Pod日志
kubectl logs -f <pod-name>                    # 实时跟踪Pod日志
kubectl exec -it <pod-name> -- /bin/bash      # 进入Pod的交互式终端
kubectl delete pod <pod-name>                 # 删除Pod

# 部署管理
kubectl get deployments                       # 查看部署
kubectl describe deployment <deployment-name> # 查看部署详情
kubectl scale deployment/<name> --replicas=3 # 扩展副本数量
kubectl rollout status deployment/<name>      # 查看部署状态
kubectl rollout history deployment/<name>     # 查看部署历史
kubectl rollout undo deployment/<name>        # 回滚到上一个版本

# 服务管理
kubectl get services                          # 查看服务
kubectl describe service <service-name>       # 查看服务详情
kubectl expose deployment/<name> --port=80    # 创建服务暴露部署

# 配置管理
kubectl get configmaps                        # 查看ConfigMap
kubectl get secrets                           # 查看Secret
kubectl apply -f <file.yaml>                  # 应用YAML配置文件
kubectl delete -f <file.yaml>                 # 删除YAML配置创建的资源

# 标签和选择器
kubectl get pods --show-labels                # 查看Pod及标签
kubectl label pod <pod-name> env=prod         # 给Pod添加标签
kubectl get pods -l app=nginx                 # 根据标签筛选Pod

# 资源详情
kubectl get all                               # 查看所有资源
kubectl api-resources                         # 查看所有API资源类型
kubectl top nodes                             # 查看节点资源使用情况
kubectl top pods                              # 查看Pod资源使用情况

# 调试和诊断
kubectl events                                # 查看事件
kubectl cp <pod-name>:<path> <local-path>     # 从Pod复制文件到本地
kubectl auth can-i create pods                # 检查当前用户权限

在网上参考了很多文章,有些因为各种原因部署的过程中会遇到问题,我就不挂上原文了,因为我参考了很多,所以在感谢这些为运维做出贡献的人!

相关推荐
编码如写诗2 小时前
【k8s】使用containerd 2.1.5运行时离线部署k8s1.31.14+全量KubeSphere4.1.3
云原生·容器·kubernetes
pl4H522a63 小时前
istio初探以及解决http-426的问题
http·kubernetes·istio
zfoo-framework7 小时前
docker compose安装gitea实现公司内部开发git私有仓库
docker·容器·gitea
无巧不成书02188 小时前
基于WSL 2的Docker远程开发全栈实战指南
运维·docker·容器·docker desktop·wsl 2·vs code远程开发·容器化开发
Renhao-Wan8 小时前
Docker 核心原理详解:镜像、容器、Namespace、Cgroups 与 UnionFS
java·后端·docker·容器
Eloudy8 小时前
docker pull ubuntu:22.04 失败的解决记录
运维·docker·容器
taWSw5OjU9 小时前
Docker] Docker中`overlay2`磁盘占用爆满的清理方案
docker·容器·eureka
Ashmcracker10 小时前
Azure Key Vault 证书如何在 AKS 中同步为 Kubernetes Secret?附权限配置与 YAML 示例
kubernetes·flask·azure
掘根1 天前
【微服务即时通讯项目】系统联调
微服务·云原生·架构