概述
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用。
核心组件
- etcd保存了整个集群的状态;
- apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
- controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
- kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
- Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
- kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;
一些概念
Pod
Pod是在K8s集群中运行部署应用或服务的最小单元,可以看作运行在K8s集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前K8s中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的小机器人控制器为Deployment、Job、DaemonSet和PetSet。
复制控制器(Replication Controller,RC)
通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。
副本集(Replica Set,RS)
RS是新一代RC,提供同样的高可用能力,区别主要在于RS后来居上,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。
部署(Deployment)
部署表示用户对K8s集群的一次更新操作。部署是一个比RS应用模式更广的API对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新RS中副本数增加到理想状态,将旧RS中的副本数减小到0的复合操作;这样一个复合操作用一个RS是不太好描述的,所以用一个更通用的Deployment来描述。以K8s的发展方向,未来对所有长期伺服型的的业务的管理,都会通过Deployment来管理。
服务(Service)
在K8s集群中,客户端需要访问的服务就是Service对象。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。在K8s集群中微服务的负载均衡是由Kube-proxy实现的。Kube-proxy是K8s集群内部的负载均衡器。它是一个分布式代理服务器,在K8s的每个节点上都有一个。
节点(Node)
K8s集群中的Node也就等同于Mesos集群中的Slave节点,是所有Pod运行所在的工作主机。
密钥对象(Secret)
Secret是用来保存和传递密码、密钥、认证凭证这些敏感信息的对象。
用户帐户(User Account)和服务帐户(Service Account)
用户帐户为人提供账户标识,而服务账户为计算机进程和K8s集群中运行的Pod提供账户标识。用户帐户和服务帐户的一个区别是作用范围;用户帐户对应的是人的身份,人的身份与服务的namespace无关,所以用户账户是跨namespace的;而服务帐户对应的是一个运行中程序的身份,与特定namespace是相关的。
名字空间(Namespace)
名字空间为K8s集群提供虚拟的隔离作用,K8s集群初始有两个名字空间,分别是默认名字空间default和系统名字空间kube-system,除此以外,管理员可以可以创建新的名字空间满足需要。
常用命令
- kubectl version 输出服务端和客户端的版本信息。
wj@master:~$ kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.4", GitCommit:"d360454c9bcd1634cf4cc52d1867af5491dc9c5f
", GitTreeState:"clean", BuildDate:"2020-11-11T13:17:17Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.4", GitCommit:"d360454c9bcd1634cf4cc52d1867af5491dc9c5f
", GitTreeState:"clean", BuildDate:"2020-11-11T13:09:17Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}fwj@master:~$ kubectl get version
- kubectl cluster-info 输出集群信息。
fwj@master:~$ kubectl cluster-info
Kubernetes master is running at https://192.168.241.160:6443
KubeDNS is running at https://192.168.241.160:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
- kubectl get 资源名 [-n 命名空间]/[-A] 输出一个/多个资源。
fwj@master:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 2d23h v1.19.4
slave NotReady <none> 2d20h v1.19.4
fwj@master:~$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d23h
myweb NodePort 10.108.222.188 <none> 8080:30001/TCP 2d17h
fwj@master:~/working$ kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 2d21h
myweb 3 3 3 2d17h
fwj@master:~$ kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
etcd-0 Healthy {"health":"true"}
controller-manager Healthy ok
scheduler Healthy ok
fwj@master:~$ kubectl get secrets
NAME TYPE DATA AGE
def-ns-admin-token-95qmk kubernetes.io/service-account-token 3 20h
default-token-hdb86 kubernetes.io/service-account-token 3 2d22h
fwj@master:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-2986g 0/1 Pending 0 63s
mysql-gc4j8 1/1 Terminating 1 2d20h
myweb-cx8f4 1/1 Terminating 1 2d17h
myweb-fn485 1/1 Terminating 1 2d17h
myweb-k8472 1/1 Terminating 1 2d17h
myweb-pcsbg 0/1 Pending 0 63s
myweb-twlsd 0/1 Pending 0 62s
myweb-wzddp 0/1 Pending 0 62s
- kubectl logs 输出pod中一个容器的日志。
fwj@master:~$ kubectl logs kube-apiserver-master -n kube-system
Flag --insecure-port has been deprecated, This flag will be removed in a future version.
I1127 06:25:31.814576 1 server.go:625] external host was not specified, using 192.168.241.160
······
- kubectl describe [资源类型] [资源名称] – 输出指定的一个/多个资源的详细信息。
fwj@master:~$ kubectl describe pod mysql-2986g
Name: mysql-2986g
Namespace: default
Priority: 0
Node: slave/192.168.241.161
······
- kubectl api-versions – 以“组/版本”的格式输出服务端支持的API版本
fwj@master:~/working$ kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
- kubectl exec 进入容器
fwj@master:~/working$ kubectl exec -it myweb-pcsbg bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] inste
ad.root@myweb-pcsbg:/usr/local/tomcat#
- kubectl create – 通过文件名或控制台输入,创建资源。
- kubectl delete – 通过文件名、控制台输入、资源名或者label selector删除资源。
- kubectl apply – 通过文件名或控制台输入,对资源进行配置。
- kubectl proxy – 为Kubernetes API server启动代理服务器。
YAML配置文件
YAML是一个JSON的超集,意味着任何有效JSON文件也都是一个有效的YAML文件。YAML只有两种结构类型你需要知道:
- Lists:项的定义以破折号(-)开头,并且与父元素之间存在缩进。
- Maps
apiVersion: v1
kind: Pod
metadata:
name: rss-site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
- name: rss-reader
image: nickchase/rss-php-nginx:v1
ports:
- containerPort: 88
等价于:
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "rss-site",
"labels": {
"app": "web"
}
},
"spec": {
"containers": [{
"name": "front-end",
"image": "nginx",
"ports": [{
"containerPort": "80"
}]
},
{
"name": "rss-reader",
"image": "nickchase/rss-php-nginx:v1",
"ports": [{
"containerPort": "88"
}]
}]
}
}
使用YAML创建RC
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 3 #Pod副本的期待数量
selector:
app: myweb #符合目标的Pod拥有此标签
template: #根据此模板创建Pod的副本(实例)
metadata:
labels:
app: myweb #Pod副本拥有的标签,对应RC的Selector
spec:
containers: #Pod内容器的定义部分
- name: myweb #容器的名称
image: hub.c.163.com/library/tomcat:latest #容器对应的Docker image
ports:
- containerPort: 8080 #容器应用监听的端口号
env: #注入容器内的环境变量
- name: MYSQL_SERVICE_HOST
value: "mysql"
- name: MYSQL_SERVICE_PORT
value: "3306"
使用YAML创建Service
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb