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 # 检查当前用户权限
在网上参考了很多文章,有些因为各种原因部署的过程中会遇到问题,我就不挂上原文了,因为我参考了很多,所以在感谢这些为运维做出贡献的人!