Kubernetes集群搭建与核心功能全解析(K8s)
文章目录
一、Kubernetes介绍(K8s)
Kubernetes 简介
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。k8s本质是一组
服务器集群,他可以在集群的每个集群的节点上运行特定的程序,来对节点职工的容器进行管理,现已成为容器编排领域的事实标准。
Kubernetes 核心功能
自动化容器部署:根据配置自动调度容器到集群中的节点,确保应用按预期运行。
弹性扩缩容:支持手动或基于资源使用情况自动调整应用实例数量。
服务发现与负载均衡:为容器组(Pod)分配唯一 IP 和 DNS 名称,并实现流量分发。
自我修复:自动重启失败容器、替换异常节点,保证应用高可用性。
配置与密钥管理:通过 ConfigMap 和 Secret 集中管理应用配置和敏感数据。
Kubernetes 核心组件
一个k8s集群主要有控制节点(master)、工作节点(node)构成,每个节点上都会安装不同组件
master:集群的控制平面,负责集群的决策(管理)
ApiServe:资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
Scheduler:负责集群资源调度,按照预定的调度策略将Pod调度到相应的Node节点上
Controller Manager:负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动跟新等
Etcd:负责存储集群中各种资源对象的信息node:集群的数据平面,负责为容器提供运行环境(干活)
Kubelet:负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
KubeProxy:负责提供集群内部的服务发现和负载均衡
Docker:负责节点上容器的各种操作
Kubernetes 核心概念
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Deployment:定义 Pod 的副本数和更新策略,实现滚动升级。
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Pod:最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境(如开发、测试环境)
Kubernetes 应用场景
| 场景 | 说明 |
|---|---|
| 微服务架构管理 | K8s通过声明式配置和自动化部署,简化微服务的生命周期管理。其内置的服务发现、负载均衡和滚动更新机制,特别适合动态扩展的微服务环境。 |
| 混合云与多云部署 | K8s的抽象层屏蔽了底层基础设施差异,允许工作负载在公有云、私有云或本地数据中心间无缝迁移。例如,Azure AKS、Amazon EKS和Google GKE均基于Kubernetes提供跨云服务。 |
| 持续交付与DevOps | 与CI/CD工具链(如Jenkins、ArgoCD)深度集成,支持蓝绿部署、金丝雀发布等策略。通过自定义Operator可实现复杂应用的全自动化发布流程。 |
| 批处理与定时任务 | 通过CronJob资源管理周期性任务,结合资源配额控制(ResourceQuota)优化计算密集型作业的资源利用率。常见于大数据处理(如Spark on K8s)或机器学习训练任务。 |
| 有状态应用编排 | StatefulSet配合持久卷(PersistentVolume)为数据库(MySQL集群)、消息队列(Kafka)等有状态服务提供稳定的存储标识和有序部署能力。 |
| 边缘计算与IoT | 轻量级发行版(如K3s)支持资源受限的边缘设备,实现分布式节点统一管理。结合服务网格(如Istio)可构建低延迟的边缘计算网络。 |
| 高可用与灾备方案 | 多副本部署结合亲和性/反亲和性规则(Affinity/Anti-affinity)确保应用跨故障域分布。etcd集群的自动故障恢复机制保障控制平面高可用。 |
| Serverless扩展 | 通过Knative或Kubernetes Native的Serverless框架(如Kubeless),在容器平台上实现函数即服务(FaaS),动态缩容至零副本以节省资源。 |
| 安全性隔离 | 利用NetworkPolicy实现微服务间的网络隔离,配合PodSecurityPolicy控制容器的权限边界。适用于金融、医疗等合规性要求严格的场景。 |
| 遗留系统现代化 | 将传统单体应用逐步拆分为容器化模块,通过Kubernetes实现灰度迁移。Sidecar模式可渐进式添加日志收集、监控等云原生能力。 |
下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:
1.k8s环境启动之后,master和node都会将自身的信息存储到etcd数据库中
2.一个nginx服务的安装请求会首先被发送到master节点的apiServer组件
3.apiServer组件会调用scheduer组件来决定到底应该把这个服务安装到哪个node节点上在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知
4.apiServerapiServer调用controller-manager去调度Node节点安装nginx服务
5.kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod。pod是kubernetes的最小操作单元,容器必须跑在pod中,
6.至此一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理这样,外界用户就可以访问集群中的nginx服务了
二、集群环境搭建
2.1 环境规划
集群类型
kubernetes集群大体上分为两类:
一主多从和多主多从。
一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境
多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境
安装方式
kubernetes有多种部署方式,目前主流的方式有
kubeadm、minikube、二进制包
minikube:用于快速搭建单节点kubernetes的工具
kubeadm:用于快速搭建kubernetes集群的工具
二进制包:从官网下载每个组件的二进制包,依次安装,此方式对于理解kubernetes组件更加有效
主机规划
| 作用 | IP地址 | 操作系统 | 配置 |
|---|---|---|---|
| Master | 192.168.109.101 | Centos7.5基础设施服务器 | 2颗CPU 2G内存 50G硬盘 |
| Node1 | 192.168.109.102 | Centos7.5基础设施服务器 | 2颗CPU 2G内存 50G硬盘 |
| Node2 | 192.168.109.103 | Centos7.5基础设施服务器 | 2颗CPU 2G内存 50G硬盘 |
2.2 环境搭建
本次环境搭建需要安装三台linux系统(
一主二从),内置Centos7.5 系统,然后在每台linux中分别安装docker(18.06.3),kubeadm(1.17.4)、kubelet(1.17.4)、kubectl(1.17.4)程序。
主机安装
安装三台主机
操作系统环境:CPU(2C) 内存(2G) 硬盘(50G)
语言选择:中文简体
软件选择:基础设施服务器
分区选择:自动分区
网络配置:按照下面配置网路地址信息网络地址:192.168.109.100(每台主机都不一样 分别为100、101、102)
子网掩码:255.255.255.0
默认网关:192.168.109.2
DNS:223.5.5.5
环境初始化
三台服务器都得安装
检查操作系统的版本
cat /etc/redhat-release(此方式下安装kubernetes集群要求Centos版本要在7.5或之上)
主机名解析
编辑三台服务器的/etc/hosts文件,添加下面内容(为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中推荐使用内部DNS服务器)
192.168.109.100 master
192.168.109.101 node1
192.168.109.102 node2
时间同步
k8s要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间.企业中建议配置内部的时间同步服务器
启动chronyd服务:systemctl start chronyd
设置chronyd服务开机自启:systemctl enable chronyd
启动稍等几秒钟验证时间:date
禁用iptables和firewalld服务
k8s和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
关闭firewalld服务:systemctl stop firewalld,systemctl disable firewalld
关闭iptables服务:systemctl stop iptables,systemctl disable iptables
禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的问题
编辑/ete/selinux/config文件,修改SELINUX=disabled,注意修改完毕之后需要重启linux服务
禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
编辑分区配置文件/etc/fstab,注释掉swap分区一行(/dev/mapper/contos-swap swap ... ...),修改后需重启linux服务
修改linux的内核参数
添加网桥过滤和地址转发功能,编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables =1
net.ipv4.ip_forward =1
重新加载配置:sysctl -p
加载网桥过滤模块:modprobe br_netfilter
查看网桥过滤模块是否加载成功:lsmod l grep br_netfilter
配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
安装ipset和ipvsadm:yum install ipset ipvsadmin -y
添加需要加载的模块写入脚本文件/etc/sysconfig/modules/ipvs.modules保存如下内容
#!/bin/bash
modprobe --ip_vsmodprobe – ip_vs_rr
modprobe --ip_vs_wrr
modprobe --ip_vs_sh
modprobe --nf_conntrack_ipv4
为脚本文件添加执行权限:chmod +x /etc/sysconfig/modules/ipvs.modules
执行脚本文件:/bin/bash /etc/sysconfig/modules/ipvs.modules
查看对应的模块是否加载成功:lsmod | grep e ip_vs -e nf_conntrack_ipv4
重启服务器
reboot
安装Docker
所有机器都得安装
切换镜像源:wget https://mirrors.aliyun.com/dacker-ce/linux/centos/docker-ce.repo -0 /etc/yum.repos.d/docker-ce.repo
查看当前镜像源中支持的docker版本:yum list docker-ce--showduplicates
安装特定版本的docker-ce(必须指定-setopt=obsoletes=8,否则yum会自动安装更高版本):yum install --setopt=obsoletes=8 docker-ce-18.86.3.ce-3.el7 -y
添加一个配置文件/eto/docker/daemon.json(Docker在默认情况下使用的Cgroup Dr1ver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs),内容如下:
{
'exec-opts":[“native.cgroupdriver=systemd”],
registry-mirrors":[“https://knBt2bca.mirror.aliyuncs.com”]
}
启动docker:systemct1.restart docker,systemctl enable docker
检查docker状态和版本:docker version
安装kubernetes组件
编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置(由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源)
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-e17-x86_64
enabled=1
gpgcheck=g
repo_gpgcheck=0gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
安装kubeadm、kubelet和kubect1:yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl.1.17.4-0 -y
配置kubelet的cgroup(编辑/etc/sysconfig/kubelet,添加下面的配置):
KUBELET CGROUP_ARGS=“–cgroup-driver=systemd”
KUBE_PROXY_MODE=“ipvs”
设置kubelet开机自启:systemctl enable kubelet
准备集群镜像
在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看:
kubeadm config images list
下载镜像,此镜像在kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替代方案
集群都执行如下指令
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for imageName in S{images[@]}; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/SimageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/SimageNamek8s.gcr.io/SimageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
集群初始化
下面的操作只需要在 master 节点上执行即可
创建集群:kubeadm init --kubernetes-version=v1.17.4 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=192.168.109.100
创建必要文件:mkdir -p $HOME/.kube,sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g)$HOME/.kube/config
下面的操作只需要在 node 节点上执行即可
将node节点加入集群:kubeadm join 192.168.109.100 :6443 --token ...(指令来源于master创建成功后的提示)
查看集群状态,此时的集群状态为NotReady,这是因为还没有配置网络插件:kubectl get nodes
(STATUS为NotReady)
安装网络插件
kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flanne
下面操作依旧只在 master 节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行
获取fannel的配置文件:wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改文件中quay.io仓库为quay-mirror.qiniu.com,使用配置文件启动fannel:kubectl apply -f kube-flannel.yml
稍等片刻,再次查看集群节点的状态:kubectl get nodes
(STATUS为Ready)
2.3 服务部署
在kubernetes集群中部署一个nginx程序,测试下集群是否在正常工作。
在master操作
部署nginx:kubectl create deployment nginx --image=nginx:1.14-alpine
暴露端口:kubectl expose deployment nginx --port=80 --type=kodePort
查看服务状态:kubectl get pods,svc
通过指令查询:kubectl get pod,kubectl get service
最后在电脑浏览器上访问下部署的nginx服务:192.168.109.101:xx(xx为上面service查询端口号)
三、资源管理
3.1 资源管理介绍
在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。
kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过 Pod控制器来管理Pod的
Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。
当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种 存储 系统。
学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作
3.2 YAML语法介绍
YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。
YAML语法:大小写敏感;使用缩进表示层级关系缩进不允许使用tab,只允许空格(低版本限制);缩进的空格数不重要,只要相同层级的元素左对齐即可;'#'表示注释
YAML支持以下几种数据类型:纯量:单个的、不可再分的值。对象:键值对的集合。数组:一组按次序排列的值
冒号后需要提添加空格,多段yaml配置放在一个文件中,中间要使用---分隔
纯量
指的一个简单的值,字符串、布尔值、整数、浮点数、Null、时间、日期
# (冒号后要有空格)
c1: true # 布尔类型(或True)
c2: 12 # 整型
c3: 3.14 # 浮点型
c4: ~ # null类型使用~表示nu11
c5: 2018-02-17 # 日期类型 日期必须使用IS0 8601格式,即yyyy-MM-dd
c6: 2026-01-01T15:82:31+88:00 #时间类型 时间使用IS0 8601格式,时间和日期之间使用T连接,最后使用+代表时区
c7: hello # 字符串类型 简单写法,直接写值 ,如果字符串中间有特殊字符,必须使用双引号或者单引号包裹
c8:line1
line2 # 字符串过多的情况可以拆成多行,每一行会被转化成一个空格
对象
# (推荐):
people:
age: 10
address: Jiangxi
# (了解):
people:{age:10,address:Jiangxi}
上面的转化为json相当于如下结构
{
"people": {
"age": 10,
"address": "Jiangxi"
}
}
数组
# (推荐):
address :
- 江西
- 北京
# (了解):
address:[江西,北京]
上面的转化为json相当于如下结构
{
"address": ["江西", "北京"]
}
3.3 资源管理方式
命令式对象管理:直接使用命令去操作kubernetes资源:
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
命令式对象配置:通过命令配置和配置文件去操作kubernetes资源:kubectl create/patch -f nginx-pod.yaml
声明式对象配置:通过apply命令和配置文件去操作kubernetes资源:kubectl apply -f nginx-pod.yaml
| 类型 | 操作对象 | 适用环境 | 优点 | 缺点 |
|---|---|---|---|---|
| 命令式对象管理 | 对象 | 测试 | 简单 | 只能操作活动对象,无法审计、跟踪 |
| 命令式对象配置 | 文件 | 开发 | 可以审计、跟踪 | 项目大时,配置文件多,操作麻烦 |
| 声明式对象配置 | 目录 | 开发 | 支持目录操作 | 意外情况下难以调试 |
命令式对象管理
kubectl命令:kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下:>
kubectl [command] [type][name] [flags]
comand:指定要对资源执行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
fags:指定额外的可选参数
command:kubernetes允许对资源进行多种操作,可以通过–help查看详细的操作命令:
kubectl --help
| 命令分类 | 命令 | 翻译 | 命令作用 |
|---|---|---|---|
| 基本命令 | create | 创建 | 创建一个资源 |
| edit | 编辑 | 编辑一个资源 | |
| get | 获取 | 获取一个资源 | |
| patch | 更新 | 更新一个资源 | |
| delete | 删除 | 删除一个资源 | |
| explain | 解释 | 展示资源文档 | |
| 运行和调试 | run | 运行 | 在集群中运行一个指定的镜像 |
| expose | 暴露 | 暴露资源为Service | |
| describe | 描述 | 显示资源内部信息 | |
| logs | 日志 | 输入容器在pod内的日志 | |
| attach | 缠绕 | 进入运行中的容器 | |
| exec | 执行 | 执行容器中的一个命令 | |
| cp | 复制 | 在Pod内外复制文件 | |
| rollout | 首次展示 | 管理资源的发布 | |
| scale | 规模 | 扩容Pod的数量 | |
| autoscale | 自动调整 | 自动调整Pod的数量 | |
| 高级命令 | apply | 声明配置 | 通过文件对资源进行配置 |
| label | 标签 | 更新资源上的标签 | |
| 其他命令 | cluster-info | 集群信息 | 显示集群信息 |
| version | 版本 | 显示当前Server和Client的版本 |
资源类型:kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看:
kubectl api-resources
经常使用的资源如下:
| 资源分类 | 资源名称 | 缩写 | 资源作用 |
|---|---|---|---|
| 集群级别资源 | nodes | no | 集群组成部分 |
| namespaces | ns | 隔离Pod | |
| pod资源 | pods | 装载容器 | |
| pod资源控制器 | replicationcontrollers | rc | 控制pod资源 |
| replicasets | rs | 控制pod资源 | |
| deployments | deploy | 控制pod资源 | |
| daemonsets | ds | 控制pod资源 | |
| jobs | 控制pod资源 | ||
| cronjobs | cj | 控制pod资源 | |
| horizontalpodautoscalers | hpa | 控制pod资源 | |
| statefulsets | sts | 控制pod资源 | |
| 服务发现资源 | services | svc | 统一pod对外接口 |
| ingress | ing | 统一pod对外接口 | |
| 存储资源 | volumeattachments | 存储 | |
| persistentvolumes | pv | 存储 | |
| persistentvolumeclaims | pvc | 存储 | |
| 配置资源 | configmaps | cm | 配置 |
| secrets | 配置 |
查看所有:
podkubectl get pod
查看某个:podkubectl get pod pod_name
查看某个pod,以yaml格式展示结果:kubectl get pod pod_name -o yaml
创建一个namespace:kubectl create namespace dev
获取namespace:kubectl get ns
在此namespace下创建并运行一个nginx的Pod:kubectl run pod --image=nginx -n dev(nginx:1.17.1指定版本)
查看新创建的pod:kubectl get pod -n dev
删除指定的pod:kubectl delete pod pod-864f9875b9-pcw7x
删除指定的namespace:kubectl delete ns dev
命令式对象配置
命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源
创建一个nginxpod.yaml,内容如下
apiVersion: v1
kind: Namespace
metadata:
name: dev
--- # 一个文件包含连个配置,该行拆分(---)
apiVersion: v1
kind: Pod
metadata:
name: nginxpod
namespace: dev
spec:
containers:
- name: nginx-containers
image: nginx:1.17.1
执行create命令,创建资源:
kubectl create -f nginxpod.yaml,此时发现创建了两个资源对象,分别是namespace和pod
执行get命令,查看资源:kubectl get -f nginxpod.yaml,这样就显示了两个资源对象的信息
执行delete命令,删除资源:kubectl delete -f nginxpod.yaml,此时发现两个资源对象被删除了
命令式对象配置的方式操作资源,可以简单的认为:命令+yaml配置文件(里面是命令需要的各种参数)
声明式对象配置
声明式对象配置跟命令式对象配置很相似,但是它只有一个命令apply。
首先执行一次kubectl apply -f nginxpod.yaml,发现创建了资源
再次执行一次kubectl apply -f nginxpod.yaml,发现资源没有变动
其实声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态)
使用apply操作资源:如果资源不存在,就创建,相当于kubectl create;如果资源已存在,就更新,相当于kubectl patch
kubectl的运行是需要进行配置的,它的配置文件是$HOME/.kube,如果想要在node节点运行此命令,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作:scp -r HOME/.kube node1 : HOME/
四、K8s核心资源:Namespace与Pod实战
4.1 Namespace
Namespace是非常重要资源,它的主要作用是用来实现多套环境的
资源隔离或者多租户的资源隔离。
多套环境的资源隔离:默认情况下,k8s集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。k8s通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。
多租户的资源隔离:可以通过k8s的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合k8s的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。

kubernetes在集群启动之后,会默认创建几个namespace:(查看指令:
kubectl get namespace)
default:所有未指定Namespace的对象都会被分配在default命名空间
kube-node-lease:集群节点之间的心跳维护,用于跟踪集群中每个节点的活跃状态,v1.13开始引入
kube-public:此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system:所有由Kubernetes系统创建的资源都处于这个命名空间
namespace资源相关操作:
查看所有的ns 命令:kubectl get ns(查看指定ns后面加ns名称,如:kubectl get ns default)
指定输出格式命令:kubectl get ns ns名称 -o 格式参数(常见格式wide、json、yaml如kubectl get ns default -o yaml)
查看ns详情 命令:kubectl describe ns ns名称
创建namespace:kubectl create ns dev
删除namespace:kubectl delete ns dev
配置操作方式:准备demo.yaml文件(
Namespace为dev)
apiVersion: v1
kind: Namespace
metadata:
name: dev
创建:
kubectl create -f demo.yaml
删除:kubectl delete -f demo.yaml
4.2 Pod
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的:
kubectl get pod -n kube-system
创建与运行:kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev(image指定Pod的镜像,port指定端口,namespace指定namespace,kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的)
查看所有Pod基本信息:kubectl get pods -n dev(-o wide更详细)
查看某个Pod的详细信息:kubectl describe pod xxx -n dev
获取pod IP:kubectl get pods -n dev -o wide
访问Pod:curl http://10.244.1.23:80
删除指定Pod:kubectl delete pod xxx -n dev
此时显示删除Pod成功,但是再查询,发现又新产生了一个:
kubectl get pods -n dev
这是因为当前Pod是由Pod控制器创建的,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建。此时要想删除Pod,必须删除Pod控制器
先来查询一下当前namespace下的Pod控制器:kubectl get deploy -n dev
接下来删除此PodPod控制器:kubectl delete deploy nginx -n dev
稍等片刻再查询Pod,发现Pod被删除了:kubectl get pods -n dev
配置操作方式:准备demo.yaml文件
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
创建:
kubectl create -f demo.yaml
删除:kubectl delete -f demo.yaml
4.3 Label
Label的作用就是在资源上添加标识,用来对它们进行区分和选择。
Label的特点:
一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去
Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除
可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。
一些常用的Label 示例如下:
版本标签:“version”:“release”,“version”:“stable”…
环境标签:“environment”:“dev”,“environment”:“.pro”
架构标签:“tier”:“frontend”,“tier”:“backend”
标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:
Label用于给某个资源对象定义标识
LabelSelector用于查询和筛选拥有某些标签的资源对象
当前有两种Label Selector:
基于等式的LabelSelector
name=slave:选择所有包含Label中key="name"且value="slave"的对象
env!=production:选择所有包括Label中的key="env"且value不等于"production"的对象
基于集合的LabelSelector
name in (master, slave):选择所有包含Label中的key="name"且value="master"或"slave"的对象
name not in(frontend):选择所有包含Label中的key="name"且value不等于"frontend"的对象
标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:
name=slave, env!=production
name not in (frontend), env!=production
命令方式
为pod资源打标签:kubectl label pod nginx-pod version=1.0 -n dev
为pod资源更新标签:kubectl label pod nginx-pod version=2.0 -n dev --overwrite
查看标签:kubectl get pod nginx-pod -n dev --show-labels
筛选标签:kubectl get pod -n dev -l version!=2.0 --show-labels
删除标签:kubectl label pod nginx-pod version- -n dev
配置方式
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
labels:
version: "3.0"
env: "test"
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
创建:
kubectl create -f demo.yaml
删除:kubectl delete -f demo.yaml
4.4 Deployment
在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。在kubernetes中Pod控制器的种类有很多,这里介绍Deployment。
命令操作
命令格式:kubectl run deployment名称 [参数](image指定Pod的镜像,port指定端口,replicas指定创建Pod数量,namespace指定namespace,如:kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=3 -n dev)
查看创建的Pod:kubectl get pods -n dev
查看deployment的信息:kubectl get deploy -n dev(-o wide)
查看deployment的详细信息:kubectl describe deploy nginx -n dev
删除:kubectl delete deploy nginx -n dev
配置操作:创建一个demo.yaml,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx:1.17.1
name: nginx
ports:
- containerPort: 80
Protocol: TCP
创建:
kubectl create -f demo.yaml
删除:kubectl delete -f demo.yaml
4.5 Service
以上可以利用Deployment来创建一组Pod来提供具有高可用性的服务。虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:
Pod IP会随着Pod的重建产生变化
Pod IP仅仅是集群内可见的虚拟IP,外部无法访问
这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。
Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
操作一:创建集群内部可访问的Service
暴露Service:kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
查看service:kubectl get svc svc-nginx -n dev -o wide
这里产生了一个CLUSTER-IP,这就是service的IP,在Service的生命周期中,这个地址是不会变动的,可以通过这个IP访问当前service对应的Pod:curl 10.109.179.231:80
操作二:创建集群外部也可访问的Service
上面创建的Service的type类型为ClusterIP,这个ip地址只用集群内部可访问
如果需要创建外部也可以访问的Service,需要修改type为NodePortkubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
此时查看,会发现出现了NodePort类型的Service,而且有一对Port(80:31928/TC)kubectl get svc svc-nginx-1 -n dev -o wide
接下来就可以通过集群外的主机访问节点IP:port访问服务了
删除Service :kubectl delete svc svc-nginx-1 -n dev
配置方式:创建一个demo.yaml,内容如下:
apiVersion: v1
kind: Service
metadata:
name: svc-nginx
namespace: dev
spec:
clusterIP: 10.109.179.231
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: ClusterIP
创建:
kubectl create -f demo.yaml
删除:kubectl delete -f demo.yaml
拥有Namespace、Pod、Deployment、Service资源的基本操作,就可以在kubernetes集群中实现一个服务的简单部署和访问
五、 一键部署K8s Web管理面板
之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实,为了提供更丰富的用户体验kubernetes还开发了一个基于web的用户界面(Dashboard)。用户可以使用Dashboard部署容器化的应用,还可以监控应用的状态,执行故障排查以及管理kubernetes中各种资源。
5.1 部署Dashboard
该章节为web网址界面化的部署kubernetes操作
下载yaml,并运行Dashboard
下载yaml:wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/ai0/deploy/recommended.yaml
修改kubernetes-dashboard的Service类型
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort #新增ports:
- port: 443
targetPort: 8443
nodePort: 30009 #新增
selector:
k8s-app: kubernetes-dashboard
部署:
kubectl create -f recommended.yaml
查看namespace下的kubernetes-dashboard下的资源:kubectl get pod,svc -n kubernetes-dashboard
创建访问账户,获取token
创建账号:kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
授权:kubectl create clusterrolebinding dashboard-admin-rb --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
获取账号token:kubectl get secrets -n kubernetes-dashboard | grep dashboard-adminkubectl describe secrets dashboard-admin-token-xbqhh -n kubernetes-dashboard
浏览器访问:https://192.168.109/100.30009,输入上面获取的token
之后可以在该web进行相关信息的操作,比如创建pods等
更多推荐










所有评论(0)