一、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.
2.2、安装(CentOS 7)
2.2.1、防火墙操作命令
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 查看是否为开机自启
2.2.2、安装软件、配置主节点
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
2.2.3、安装和配置网络插件
1.安装网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2.确认网络插件运行状态,出现 flannel 相关的 Pod,则插件安装成功。
kubectl get pods --all-namespaces
2.2.4、添加工作节点
1.在主节点上生成 kubeadm join 命令的 Token
sudo kubeadm token create --print-join-command
2.在工作节点上运行 kubeadm join 命令
sudo kubeadm join <master-node-ip>:6443 --token <token-value> --discovery-token-ca-cert-hash sha256:<hash-value>
2.2.5、部署POD
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