k8s集群基本分为2类节点:
master node
:主控节点(主要负责调度,不实际运行业务)worker node
: 工作节点master节点的组件:(可以理解为程序)
apiserver
:接收客户端操作k8s的指令schduler
(调度) [ˈskɛdʒʊlər]从多个worker node节点的组件中通过算法选举
一个来启动服务controller manager
:向worker node
的kubectl
发送指令node节点的组件:
kubelet
: 向docker发送指令管理docker容器的kubeproxy
: 管理docker容器网络的etcd:
pod:
controllers:(控制器,用来启动、停止、删除Pod)
service:
label:
namesapce:(名称空间)
kubeadm安装推荐比官方详细,适用于学习
https://kuboard.cn/install/install-dashboard.html
NAME SHORTNAMES APIGROUP NAMESPACED KIND
bindings true Binding
componentstatuses cs false ComponentStatus
configmaps cm true ConfigMap
endpoints ep true Endpoints
events ev true Event
limitranges limits true LimitRange
namespaces ns false Namespace
nodes no false Node
persistentvolumeclaims pvc true PersistentVolumeClaim
persistentvolumes pv false PersistentVolume
pods po true Pod
podtemplates true PodTemplate
replicationcontrollers rc true ReplicationController
resourcequotas quota true ResourceQuota
secrets true Secret
serviceaccounts sa true ServiceAccount
services svc true Service
mutatingwebhookconfigurations admissionregistration.k8s.io false MutatingWebhookConfiguration
validatingwebhookconfigurations admissionregistration.k8s.io false ValidatingWebhookConfiguration
customresourcedefinitions crd,crds apiextensions.k8s.io false CustomResourceDefinition
apiservices apiregistration.k8s.io false APIService
controllerrevisions apps true ControllerRevision
daemonsets ds apps true DaemonSet
deployments deploy apps true Deployment
replicasets rs apps true ReplicaSet
statefulsets sts apps true StatefulSet
tokenreviews authentication.k8s.io false TokenReview
localsubjectaccessreviews authorization.k8s.io true LocalSubjectAccessReview
selfsubjectaccessreviews authorization.k8s.io false SelfSubjectAccessReview
selfsubjectrulesreviews authorization.k8s.io false SelfSubjectRulesReview
subjectaccessreviews authorization.k8s.io false SubjectAccessReview
horizontalpodautoscalers hpa autoscaling true HorizontalPodAutoscaler
cronjobs cj batch true CronJob
jobs batch true Job
certificatesigningrequests csr certificates.k8s.io false CertificateSigningRequest
leases coordination.k8s.io true Lease
bgpconfigurations crd.projectcalico.org false BGPConfiguration
clusterinformations crd.projectcalico.org false ClusterInformation
felixconfigurations crd.projectcalico.org false FelixConfiguration
globalnetworkpolicies crd.projectcalico.org false GlobalNetworkPolicy
globalnetworksets crd.projectcalico.org false GlobalNetworkSet
hostendpoints crd.projectcalico.org false HostEndpoint
ippools crd.projectcalico.org false IPPool
networkpolicies crd.projectcalico.org true NetworkPolicy
events ev events.k8s.io true Event
daemonsets ds extensions true DaemonSet
deployments deploy extensions true Deployment
ingresses ing extensions true Ingress
networkpolicies netpol extensions true NetworkPolicy
podsecuritypolicies psp extensions false PodSecurityPolicy
replicasets rs extensions true ReplicaSet
nodes metrics.k8s.io false NodeMetrics
pods metrics.k8s.io true PodMetrics
networkpolicies netpol networking.k8s.io true NetworkPolicy
poddisruptionbudgets pdb policy true PodDisruptionBudget
podsecuritypolicies psp policy false PodSecurityPolicy
clusterrolebindings rbac.authorization.k8s.io false ClusterRoleBinding
clusterroles rbac.authorization.k8s.io false ClusterRole
rolebindings rbac.authorization.k8s.io true RoleBinding
roles rbac.authorization.k8s.io true Role
priorityclasses pc scheduling.k8s.io false PriorityClass
storageclasses sc storage.k8s.io false StorageClass
volumeattachments storage.k8s.io false VolumeAttachment
kubectl get po/svc/cm/deploy: 查看容器
kubectl describe po name :查看详情
kubectl delete po name :删除资源
-o wide : 多显示几列详细信息
-A: 所有命名空间
-n name : 指定命名空间(default可以不带此参数)
kubectl apply/create -f aaa.yaml : 执行yml文件
kubectl exec 容器名称 -it -- /bin/bash : 进入容器
k8s通过控制器(Controller)创建容器组(Pod)
apply
通过yaml创建资源对象
kubectl apply -f nginx-deployment.yaml
创建deployment
的创建pod
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的资源类型,我们使用的是 Deployment 还有Pod Service等
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.7.9 #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
ports:
- containerPort: 80
再通过service
暴露pod的服务
kubectl apply -f nginx-service.yaml
# 创建文件 nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service #Service 的名称
labels: #Service 自己的标签
app: nginx #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec: #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
selector: #标签选择器
app: nginx #选择包含标签 app:nginx 的 Pod
ports:
- name: nginx-port #端口的名字
protocol: TCP #协议类型 TCP/UDP
port: 80 #集群内的其他容器组可通过 80 端口访问 Service
nodePort: 32600 #通过任意节点的 32600 端口访问 Service
targetPort: 80 #将请求转发到匹配 Pod 的 80 端口
type: NodePort #Serive的类型,ClusterIP/NodePort/LoaderBalancer
#clusterIP: None #无头服务
service
简写svc
是用于暴露Pod
的基于4层负载均衡,由于Pod的ip地址会随时改变,所以需要通过创建service一个抽象接口来进行访问。
ClusterIP
:只能在集群内部访问,类似于vip,进行轮询访问,或者是{servicename}.{namespace}
NodePort
: 外部通过node节点使用ip:port
访问,通过kube-proxy暴露监听端口
LoaderBalancer
:通过负载均衡器,一般是云厂商提供,收费功能。
None
: headless service也成为无头服务,statefulset的访问方式{pod-name}.{service-name}.{namespace}.svc.cluster.local
,deployment的访问方式{service-name}.{namespace}.svc.cluster.local
通过ingress
发布web服务,nginx-ingress理解为一个特定修改版的Nginx,用来发布nginx里面的服务,可以做4层/7层的负载均衡
需要先安装nginx-ingress
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress-for-nginx # Ingress 的名字,仅用于标识
spec:
rules: # Ingress 中定义 L7 路由规则
- host: test.cn # 根据 virtual hostname 进行路由(请使用您自己的域名)
http:
paths: # 按路径进行路由
- path: /
backend:
serviceName: nginx-service # 指定后端的 Service 为之前创建的 nginx-service
servicePort: 80
nginx-ingress的配置
https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md
创建configMap
并以volumes
挂载配置文件
# vim my-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
data:
test.json: |
{
"user":"lzh",
"age":"25",
"sexy":"man"
}
# vim busybox-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox-dep
labels:
app: busybox
spec:
replicas: 1
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["sleep"]
args: ["1000"]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap: #通过volumes的形式挂载configmap,也可以通过hostPath的方式挂载宿主机目录
name: env-config
创建PV和PVC
[root@coreddns volume]# cat pv-nfs.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 2Gi #一个大概多少G都行,并不是实际意义上的nfs控件
volumeMode: Filesystem
accessModes:
- ReadWriteMany #访问模式
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow # 自定义存储类字符串
nfs:
path: /data
server: 192.168.123.250
[root@coreddns volume]# cat pvc-nginx.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
namespace: default
spec:
storageClassName: slow #匹配PV的存储类
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 1Gi #匹配PV的存储控件
[root@coreddns k8s]# cat nginx-deployment.yaml
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的类型,我们使用的是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.8 #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
volumeMounts: #容器内挂载卷
- name: nfs-pvc #匹配卷
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-pvc #创建卷
persistentVolumeClaim:
claimName: nginx-pvc #申请PVC卷