Kubernetes 集群简介
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。它为容器提供了一个完整的管理框架,帮助开发者和运维团队在大规模环境中高效地部署和管理应用。
Kubernetes 集群是由多个组件组成的,主要包括控制平面和工作节点。集群的核心目的是确保容器化应用的高可用性、可扩展性、负载均衡、自动化部署等功能。
Kubernetes 集群的基本架构
一个标准的 Kubernetes 集群通常由以下几个部分组成:
1. 控制平面(Control Plane)
控制平面是集群的“大脑”,负责管理和控制整个集群的操作。控制平面由多个组件构成,主要包括:
API Server(kube-apiserver):所有的 REST 操作都通过 API Server 与集群交互。它是 Kubernetes 集群的入口,负责处理客户端请求、管理集群状态等。
Controller Manager(kube-controller-manager):负责集群的控制循环,管理一些后台任务,如副本控制器(Replicas)、节点管理、部署管理等。
Scheduler(kube-scheduler):负责将待调度的 Pod 安排到合适的工作节点上。调度策略基于节点的资源、约束条件等进行决策。
etcd:一个高可用的键值存储系统,存储了集群的所有状态数据(如 Pod 的状态、服务发现等)。
2. 工作节点(Worker Node)
工作节点负责运行容器化的应用,每个工作节点都运行着以下几个重要组件:
kubelet:是工作节点上的主要代理,负责管理节点上的容器生命周期,确保容器的状态符合期望。
kube-proxy:负责实现网络代理和负载均衡,管理节点上的服务访问。
容器运行时:例如 Docker、containerd 等,负责管理容器的生命周期,包括创建、启动、停止容器等操作。
Kubernetes 集群的基本概念
Kubernetes 集群中有多个基本的资源和概念,下面列出了一些核心元素:
Pod:Pod 是 Kubernetes 中最小的部署单元,它封装了一个或多个容器。Pod 内部的容器共享网络和存储资源。
Node:Node 是集群中的工作节点,负责运行容器化的应用程序。
Deployment:Deployment 是一种用于声明和管理 Pod 的资源,它支持 Pod 的自动部署、滚动更新和回滚等。
Service:Service 提供了一个抽象的网络访问层,允许外部或集群内部的服务与应用程序进行通信。
Namespace:Namespace 用于将集群中的资源进行逻辑分隔,使得不同的团队或项目可以在同一个集群内独立管理。
ReplicaSet:ReplicaSet 负责确保集群中有指定数量的 Pod 副本在运行。
StatefulSet:类似于 ReplicaSet,但用于管理有状态应用(如数据库),提供稳定的网络身份和存储。
Kubernetes 集群的核心功能
自动化部署和回滚:Kubernetes 能够自动化部署应用程序,并支持在出现问题时快速回滚到之前的稳定状态。
负载均衡和服务发现:Kubernetes 提供了内建的负载均衡机制,自动将流量分配到集群中的不同 Pod 上。同时,Kubernetes 也支持服务发现,使得应用程序可以轻松找到其他服务。
自动扩展:Kubernetes 可以根据负载自动调整 Pod 的副本数量,确保应用具有弹性。
自我修复:当 Pod 或节点出现故障时,Kubernetes 会自动重启或重新调度容器,以保证应用的高可用性。
资源管理:Kubernetes 提供了 CPU、内存等资源的管理和限制,确保应用的资源分配符合预期。
声明式管理:Kubernetes 支持声明式的资源管理,用户只需要描述期望的状态,Kubernetes 会负责实现这一目标。
Kubernetes 集群的优势
高可用性:通过负载均衡、故障恢复和自动重调度,Kubernetes 提供了高可用的应用环境。
弹性伸缩:Kubernetes 可以自动根据负载情况进行水平扩展和收缩,以应对不同的流量需求。
简化的容器管理:Kubernetes 抽象化了容器管理的复杂性,提供了简单的 API 进行管理。
多云和混合云支持:Kubernetes 可以在不同云平台之间迁移应用,实现跨平台部署。
总结
Kubernetes 是一个功能强大且灵活的容器管理平台,它帮助开发者和运维人员自动化地部署、扩展和管理容器化的应用程序。通过 Kubernetes 集群,可以实现高度可用、可扩展、自动化管理的云原生应用部署。
一、环境准备
服务器要求:
最小硬件配置:2核CPU、4G内存、30G硬盘。
服务器可以访问外网。
软件环境:
操作系统:Anolis OS 7.9
Docker:18.06.1版本
Kubernetes:v1.18.0版本
服务器清单:
master:192.168.153.221
node1:192.168.153.222
node2:192.168.153.223
二、环境配置(每台服务器都要配置)
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
# 临时
setenforce 0
# 永久
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 关闭swap
# 临时
swapoff -a
# 永久
sed -ri 's/.*swap.*/#&/' /etc/fstab
#永久设置hostname (根据机器分别设置对应的主机名 mster、node1、node2)
sudo hostnamectl set-hostname master
sudo hostnamectl set-hostname node1
sudo hostnamectl set-hostname node2
#在master节点上面hosts文件添加内容
sudo cat >> /etc/hosts << EOF
192.168.153.221 master
192.168.153.222 node1
192.168.153.223 node2
EOF
#将桥接的IPv4流量传递到iptables的链
sudo cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
#使k8s.conf立即生效
sudo sysctl --system
#时间同步
#安装 ntpdate工具
sudo yum install -y ntpdate
#执行同步时间命令
sudo ntpdate time.windows.com
三、安装Docker(每台服务器都要安装)
#安装依赖
yum install -y net-tools
yum install -y wget
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#设置阿里云镜像源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#安装指定版本的docker-ce
sudo yum -y install docker-ce-18.06.1.ce-3.el7
#启动Docker服务
sudo systemctl start docker
#查看服务状态:
sudo systemctl status docker
#设置开机自启
sudo systemctl enable docker
#查看docker 版本
sudo docker --version
#重启服务器
sudo reboot now
#查看docker配置是否生效
sudo docker info
四、开始安装Kubernetes
#添加yum软件源kubernetes.repo为阿里云(每台服务器都要安装)
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=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
EOF
#安装 kubelet、kubeadm、kubectl(每台服务器都要安装)
sudo yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
#设置开机启动和启动(每台服务器都要安装)
sudo systemctl enable kubelet
sudo systemctl start kubelet
#开始部署Kubernetes
#Kubernetes初始化(master节点上面)
kubeadm init \
--v=5 \
--apiserver-advertise-address=192.168.153.221 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
#注释
kubeadm init \
--v=5 \ # 设置日志级别,'5' 是较高的详细日志级别,便于调试
--apiserver-advertise-address=192.168.153.221 \ # API 服务器的广告地址,节点需要能够通过此地址访问 Kubernetes API Server
--image-repository=registry.aliyuncs.com/google_containers \ # 指定 Kubernetes 控制平面镜像的仓库地址,默认为 Docker Hub,这里使用阿里云镜像仓库
--kubernetes-version=v1.18.0 \ # 指定要安装的 Kubernetes 版本,这里为 v1.18.0
--service-cidr=10.96.0.0/12 \ # 集群内服务的 CIDR 地址段,这里设置为 10.96.0.0/12,Kubernetes 服务(如 ClusterIP)将分配在此范围内
--pod-network-cidr=10.244.0.0/16 # Pod 网络的 CIDR 地址段,这里设置为 10.244.0.0/16,指定了 Pod 所在的网络范围,通常与 CNI 插件(如 Flannel)一起使用
#
#输出结果出现以下内容表示成功
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
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.153.221:6443 --token 10xqir.niwio3jacc54a4qj \
--discovery-token-ca-cert-hash sha256:267e7a7fcc41ebfc2120abc9d171f612373b0610e906feef36f22d253d124e13
#
#重新生成 kubeadm join 所需的命令和 token。
sudo kubeadm token create --print-join-command
#加入集群(在node节点执行命令)
kubeadm join 192.168.153.221:6443 --token fjoeha.7a2hiqp8sc3tpr01 --discovery-token-ca-cert-hash sha256:267e7a7fcc41ebfc2120abc9d171f612373b0610e906feef36f22d253d124e13
#输出结果出现以下内容表示成功
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.
#
#拷贝k8s认证文件(master节点上面)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#查看Kubernetes集群中所有节点的详细信息(master节点上面)
kubectl get nodes
五、常用 kubectl
命令
功能 | 命令 | 说明 |
---|---|---|
集群和节点管理 | kubectl cluster-info | 查看集群的基本信息 |
kubectl version | 查看集群版本信息 | |
kubectl get nodes | 查看集群中所有节点的状态 | |
kubectl describe node <node-name> | 查看单个节点的详细信息 | |
Pod 管理 | kubectl get pods --all-namespaces | 查看所有命名空间下的所有 Pod |
kubectl get pods -n <namespace> | 查看指定命名空间的所有 Pod | |
kubectl describe pod <pod-name> -n <namespace> | 查看单个 Pod 的详细信息 | |
kubectl logs <pod-name> -n <namespace> | 查看 Pod 的日志 | |
kubectl logs -f <pod-name> -n <namespace> | 实时查看 Pod 的日志 | |
kubectl exec -it <pod-name> -n <namespace> -- <command> | 在 Pod 中执行命令 | |
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash | 进入 Pod 容器的交互式终端 | |
kubectl delete pod <pod-name> -n <namespace> | 删除指定 Pod | |
Deployment 管理 | kubectl get deployments -n <namespace> | 查看所有 Deployment |
kubectl describe deployment <deployment-name> -n <namespace> | 查看 Deployment 详细信息 | |
kubectl set image deployment/<deployment-name> <container-name>=<new-image> -n <namespace> | 更新 Deployment 的镜像 | |
kubectl rollout restart deployment <deployment-name> -n <namespace> | 滚动更新 Deployment | |
kubectl rollout status deployment <deployment-name> -n <namespace> | 查看 Deployment 更新状态 | |
kubectl rollout undo deployment <deployment-name> -n <namespace> | 回滚 Deployment | |
Service 管理 | kubectl get svc -n <namespace> | 查看所有 Service |
kubectl describe svc <service-name> -n <namespace> | 查看指定 Service 的详细信息 | |
kubectl expose pod <pod-name> --port=<port> --name=<service-name> -n <namespace> | 将 Pod 暴露为 Service | |
kubectl expose deployment <deployment-name> --port=<port> --name=<service-name> -n <namespace> | 将 Deployment 暴露为 Service | |
Namespace 管理 | kubectl get namespaces | 查看所有命名空间 |
kubectl create namespace <namespace-name> | 创建命名空间 | |
kubectl delete namespace <namespace-name> | 删除命名空间 | |
ConfigMap 和 Secret 管理 | kubectl get configmap -n <namespace> | 查看所有 ConfigMap |
kubectl describe configmap <configmap-name> -n <namespace> | 查看 ConfigMap 详细信息 | |
kubectl create configmap <configmap-name> --from-literal=<key>=<value> -n <namespace> | 创建 ConfigMap | |
kubectl delete configmap <configmap-name> -n <namespace> | 删除 ConfigMap | |
kubectl get secret -n <namespace> | 查看所有 Secret | |
kubectl describe secret <secret-name> -n <namespace> | 查看 Secret 详细信息 | |
kubectl create secret generic <secret-name> --from-literal=<key>=<value> -n <namespace> | 创建 Secret | |
资源管理 | kubectl top nodes | 查看节点资源使用情况 |
kubectl top pods -n <namespace> | 查看 Pod 的资源使用情况 | |
集群状态和健康检查 | kubectl get componentstatuses | 查看集群组件状态 |
kubectl get --raw='/healthz' | 查看 API 服务器健康状态 | |
Pod 和资源调度 | kubectl label nodes <node-name> <label-key>=<label-value> | 给节点添加标签 |
kubectl apply -f <pod-definition-file>.yaml | 创建或更新 Pod | |
Pod 管理(高级) | kubectl get pods --show-labels | 查看 Pod 和相关的 Deployment |
kubectl delete pod <pod-name> --force --grace-period=0 -n <namespace> | 强制删除 Pod | |
kubectl get events -n <namespace> | 查看 Pod 相关事件 | |
调试和执行命令 | kubectl exec -it <pod-name> -- /bin/bash | 进入 Pod 容器交互式终端 |
kubectl cp <local-file> <namespace>/<pod-name>:<pod-path> | 复制本地文件到 Pod 中 | |
kubectl cp <namespace>/<pod-name>:<pod-path> <local-file> | 从 Pod 复制文件到本地 | |
故障排查和日志 | kubectl get events --sort-by='.metadata.creationTimestamp' | 查看集群事件 |
kubectl logs <pod-name> -n <namespace> --previous | 查看 Pod 的历史日志(失败的容器) |
这个表格总结了常用的 kubectl
命令,你可以根据需要快速查找命令来进行集群、Pod、Service 和其他 Kubernetes 资源的管理和操作。