一、kubernetes 简介
谷歌2014年开源的管理工具项目,简化微服务的开发和部署。
提供功能:自愈和自动伸缩、调度和发布、调用链监控、配置管理、Metrics监控、日志监控、弹性和容错、API管理、服务安全等。
官网:https://kubernetes.io/zh-cn/
GitHub地址:https://github.com/kubernetes/kubernetes
1.1、Kubernetes 主要功能
1.自我修复:当某个容器崩溃时,能够在1秒左右迅速启动新的容器
2.弹性伸缩:根据需要,自动对集群中正在运行的容器数量进行调整
3.服务发现:服务可以通过自动发现的形式找到它所依赖的服务
4.负载均衡:当一个服务起动了多个容器,能够自动实现请求的负载均衡
5.版本回退:当发现新发布的程序版本有问题,可以立即回退到原来的版本
6.存储编排:根据容器自身的需求自动创建存储卷,Pod中容器之间共享数据
1.2、Kunbernetes 主要概念
1.Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
2.Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
3.Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
4.Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
5.Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
6.Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
7.NameSpace:命名空间,用来隔离pod的运行环境
1.3、组件
一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。
1.Master:负责集群的决策管理
2.ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
3.Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
4.ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
5.Etcd:负责存储集群中各种资源对象的信息
6.Node:负责为容器提供运行环境
7.Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
8.KubeProxy : 负责提供集群内部的服务发现和负载均衡
9.Docker : 负责节点上容器的各种操作
1.3.1、节点组成
1.master 主节点
Etcd:整个集群的数据库,存储集群的状态数据、配置、节点等,采用 Raft 协议。
API-server:连其它组件、Etcd,提供各类 api 处理,和 Node节点 通信等。对外提供操作和获取 k8s 集群资源的 API。
Scheduler:在 k8s 集群中做调动决策,负责资源的调度、打分、分配资源。
Controller-Manager:控制各类 Controller,观察、维护集群的状态,故障检测、自动扩展、滚动更新等,协调让实际状态和预期状态达到一致。
2.work 从节点
Docker:负责容器创建和管理。
Kubelet:管理容器的生命周期,与 master 节点交互(汇报自身情况)。
Kube-proxy:网络代理,Pod 寻址、负载均衡等。
1.4、工作流程
1.当kubernetes启动后,master和node将自身的信息存储到etcd数据库中;
2.一个服务的安装请求会首先被发送到master节点的apiServer组件;
3.apiServer调用scheduler组件来决定服务安应该装到哪个node节点上;从etcd中读取各个node节点的信息;
4.apiServer调用controller-manager去调度Node节点安装服务;
5.kubelet接收到指令后,会通知docker,由docker来启动一个服务pod;
6.访问服务要通过kube-proxy来对pod产生访问的代理,如此就可以访问集群中的服务了。
二、使用
2.1、常用命令
# 查看命令
kubectl --help
# 查询k8s集群节点
kubectl get nodes
# 查看所有的pod
kubectl get pod
# 查看pod详细内容
kubectl describe pod nginx-6867cdf567-ht2bz
# 查看k8s 集群的信息
kubectl cluster-info
# 查看当前k8s 集群的版本
kubectl version
#命令形式创建一个namespace
kubectl create namespace udiannet-dev
# 查询所有的namespace
kubectl get ns
# 在udiannet-dev的namespace 下运行一个pod
kubectl run pod --image=nginx -n udiannet-dev
# 查看udiannet-dev下的pod
kubectl get pod -n udiannet-dev
# 查看该pod的详细信息(要制定namespace)
kubectl describe pod pod-864f9875b9-492tz -n udiannet-dev
# 删除该pod(要指定namespace)
kubectl delete pods pod-864f9875b9-492tz -n udiannet-dev
# 创建一容器镜像为 nginx 名称为 nginx-test 的 Pod 并在 8080 端口将其暴露为与Pod 同名的 Service
kubectl run nginx-test --image=nginx --port=8080 --expose
NameSpace的创建
# 创建一个namespace
[k8s@administrator root]$ kubectl create namespace test
namespace/test created
# 查看namespace
[k8s@administrator root]$ kubectl get ns
NAME STATUS AGE
default Active 3d3h
kube-node-lease Active 3d3h
kube-public Active 3d3h
kube-system Active 3d3h
test Active 8s
# 创建并运行一个nginx的Pod资源
[k8s@administrator root]$ kubectl run nginx-pod --image=nginx -n test
pod/nginx-pod created
# 查看test命名空间下新创建的pod
[k8s@administrator root]$ kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 8s
# 查看默认namespace中的资源
[k8s@administrator root]$ kubectl get pods
No resources found in default namespace.
# 删除指定的pod
[k8s@administrator root]$ kubectl delete pod nginx-pod -n test
pod "nginx-pod" deleted
# 删除命名空间
[k8s@administrator root]$ kubectl delete ns test
namespace "test" deleted
# 查看命名空间
[k8s@administrator root]$ kubectl get ns
NAME STATUS AGE
default Active 3d3h
kube-node-lease Active 3d3h
kube-public Active 3d3h
kube-system Active 3d3h
# 查看某个NS,同时指定输出格式,常用格式:wide、json、yaml
[k8s@administrator ~]$ kubectl get ns default -o json
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"creationTimestamp": "2022-03-21T09:00:52Z",
"labels": {
"kubernetes.io/metadata.name": "default"
},
"name": "default",
"resourceVersion": "212",
"uid": "2c41f796-922b-426c-a5f4-78627e008e6b"
},
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"phase": "Active"
}
}
# 查看ns详情
[k8s@administrator ~]$ kubectl describe ns default
Name: default
Labels: kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.