主要内容
K8S的重要组件
master中的组件
K8S包括master和node,它们各自运行着不同的组件。其中master节点中运行着一些重要组件,这些组件都以容器的形式运行。
这些组件包括:
- apiserver 用于暴露Kubernetes API。任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行
- controller-manager 由多个控制器线程组成,这些控制器通常是一个独立的进程。
- scheduler 调度器。用于为pod选择合适的node进行部署
- etcd 集群信息中心。所有Kubernetes需要的信息都保存在etcd中,例如网络配置、节点配置等
controller-manager由以下controller组成
- Node控制器 用于监控节点的状态,例如up或down
- Replication控制器 用于维护节点中的pod数量
- Endpoints控制器 填充Endpoint对象,例如连接service和pod
- Service Account 和Token控制器 为新的Namespace创建默认帐户访问API Token。
通过下面的命令可以查询这些组件的运行情况
1 2 3 4 5 6 7 |
k8s@server:~$ kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-server 1/1 Running 2 47h kube-system kube-apiserver-server 1/1 Running 2 47h kube-system kube-controller-manager-server 1/1 Running 2 47h kube-system kube-scheduler-server 1/1 Running 3 47h |
也可以通过下面的命令检查组件状态是否健康
1 2 3 4 5 6 |
k8s@server:~$ kubectl get cs -o wide NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health": "true"} |
node中的组件
node的作用相对来说没有那么重要,因此node节点中的组件比master的少,主要有:
- kube-proxy
- kubelet
kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象,例如service和pod通讯。
kubelet是node节点执行命令的前端,apiserver可以直接和kubelet通讯。它不是以容器的方式执行,而是systemd的形式。
相关概念
这些概念主要是controller,包括Pod、ReplicaSet、Deployment、Namespace等。
Pod
Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod可以封装一个或多个容器,同一个Pod中的所有容器共享所有资源。
Kubernetes中的Pod使用可分两种主要方式:
- Pod中运行一个容器。“one-container-per-Pod”模式是Kubernetes最常见的用法; 在这种情况下,你可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。
- Pods中运行多个需要一起工作的容器。Pod可以封装紧密耦合的应用,它们需要由多个容器组成,它们之间能够共享资源,这些容器可以形成一个单一的内部service单位 – 一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。
ReplicaSet
ReplicaSet和前面说过的Replication Controller类似。ReplicaSet也是控制器,用于管理Pod在节点中的数量,在旧版的K8S中使用的是Replication Controller,但新版中建议使用ReplicaSet。
Deployment
Deployment也是其中一种控制器,Deployment处于比ReplicaSet更高的一个层次。我们都知道Pod由ReplicaSet管理,而ReplicaSet则由Deployment管理,因此我们很少有必要直接使用ReplicaSet控制器,更多的是使用Deployment。
Namespace
名称空间用于对Pod进行逻辑隔离,不同Namespace中的Pod不能进行通讯。用户创建的Pod在default名称空间中运行,Kubernetes的核心组件运行在kube-system名称空间中。
获取所有名称空间
1 2 3 4 5 6 |
k8s@server:~$ kubectl get namespaces NAME STATUS AGE default Active 2d kube-public Active 2d kube-system Active 2d |
获取特定名称空间组的Pod
1 2 3 4 5 |
k8s@server:~$ kubectl get pods --namespace=default NAME READY STATUS RESTARTS AGE nginx-dbddb74b8-4lrwn 1/1 Running 0 14s nginx-dbddb74b8-hnvn8 1/1 Running 0 14s |
Kubernetes对象
K8S对象实际上是一个描述性文件,通常是yaml格式。K8S对象通常有以下作用
- 描述Pod中容器的特征,例如应该在哪个节点运行
- 描述容器可用的资源
- 描述容器的运行策略,例如升级和容错策略等
K8S通过kubectl apply
命令使用这些对象,例如下面定义了一个Deployment的对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 # tells deployment to run 2 pods matching the template template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 |
然后就可以通过这个对象创建Deployment,假如文件名称是nginx.yaml:
1 2 |
kubectl apply -f nginx.yaml |
对象参考
对象文件应该如何编写,估计很多人难以记得,因为涉及的参数太多。因此官方提供了API参考,编写的时候就可以跟着这份文档来做,慢慢就熟悉了
转载请注明:Pure nonsense » kubernetes相关概念