谷歌2014年开源的管理工具项目,简化微服务的开发和部署。
提供功能:自愈和自动伸缩、调度和发布、调用链监控、配置管理、Metrics监控、日志监控、弹性和容错、API管理、服务安全等。
官网:https://kubernetes.io/zh-cn/
GitHub地址:https://github.com/kubernetes/kubernetes
- 1.自我修复:当某个容器崩溃时,能够在1秒左右迅速启动新的容器
-
- 2.弹性伸缩:根据需要,自动对集群中正在运行的容器数量进行调整
-
- 3.服务发现:服务可以通过自动发现的形式找到它所依赖的服务
-
- 4.负载均衡:当一个服务起动了多个容器,能够自动实现请求的负载均衡
-
- 5.版本回退:当发现新发布的程序版本有问题,可以立即回退到原来的版本
-
- 6.存储编排:根据容器自身的需求自动创建存储卷,Pod中容器之间共享数据
- 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的运行环境
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 : 负责节点上容器的各种操作

Etcd:整个集群的数据库,存储集群的状态数据、配置、节点等,采用 Raft 协议。
API-server:连其它组件、Etcd,提供各类 api 处理,和 Node节点 通信等。对外提供操作和获取 k8s 集群资源的 API。
Scheduler:在 k8s 集群中做调动决策,负责资源的调度、打分、分配资源。
Controller-Manager:控制各类 Controller,观察、维护集群的状态,故障检测、自动扩展、滚动更新等,协调让实际状态和预期状态达到一致。
Docker:负责容器创建和管理。
Kubelet:管理容器的生命周期,与 master 节点交互(汇报自身情况)。
Kube-proxy:网络代理,Pod 寻址、负载均衡等。
- 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产生访问的代理,如此就可以访问集群中的服务了。
- # 查看命令
- 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:
- Status: Active
-
- No resource quota.
-
- No LimitRange resource.
- service iptables start 开启防火墙
- service iptables stop 关闭防火墙
- service iptables status 查看防火墙状态
- chkconfig iptables on 防火墙开机自启
- chkconfig iptables off 禁止开机自启
- chkconfig iptables status 查看是否为开机自启
- systemctl start firewalld 开启防火墙
- systemctl stop firewalld 关闭防火墙
- systemctl status firewalld 查看防火墙状态
- systemctl enable firewalld 防火墙开机自启
- systemctl disable firewalld 禁止开机自启
- systemctl is-enabled firewalld 查看是否为开机自启
- 1.安装 Docker 和 Kubernetes 组件
- # 安装 Docker
- sudo yum install docker -y
- sudo systemctl enable docker.service
- sudo systemctl start docker.service
- # 安装 Kubernetes 组件
- sudo yum install kubeadm kubelet kubectl -y
- sudo systemctl enable kubelet.service
- sudo systemctl start kubelet.service
- 2.配置防火墙
- # 打开必要的端口
- sudo firewall-cmd --permanent --add-port=6443/tcp
- sudo firewall-cmd --permanent --add-port=2379-2380/tcp
- sudo firewall-cmd --permanent --add-port=10250/tcp
- sudo firewall-cmd --permanent --add-port=10251/tcp
- sudo firewall-cmd --permanent --add-port=10252/tcp
- sudo firewall-cmd --permanent --add-port=10255/tcp
- sudo firewall-cmd --reload
- 3.配置 Kubernetes 主节点
- sudo kubeadm init --apiserver-advertise-address=192.168.1.100 --pod-network-cidr=10.244.0.0/16
- 1.安装网络插件
- kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 2.确认网络插件运行状态,出现 flannel 相关的 Pod,则插件安装成功。
- kubectl get pods --all-namespaces
- 1.在主节点上生成 kubeadm join 命令的 Token
- sudo kubeadm token create --print-join-command
- 2.在工作节点上运行 kubeadm join 命令
- sudo kubeadm join
:6443 --token value> --discovery-token-ca-cert-hash sha256:value>
- 1.编写 Pod 配置文件
- apiVersion: v1
- kind: Pod
- metadata:
- name: example
- spec:
- containers:
- - name: nginx
- image: nginx:latest
- ports:
- - containerPort: 80
- 2.部署 Pod
- kubectl apply -f example-pod.yaml
- 3.确认 Pod 运行状态
- kubectl get pods