flannel插件
flannel使用etcd来存储定义节点的物理IP以及它所持有的子网,它给每一个节点分配一个子网。而每一个子网的划分是由controller-manager来分配的。
Flannel的网络模型flannel支持三种Pod网路模型,每个模型在flannel中称为一种”backend”:
vxlan:Pod与Pod经由隧道封装后通信,各节点彼此间能通信就行,不要求位于同一个二层网络
vxlan directrouting:位于同一个二层网络上的不同节点上的Pod间通信,无需隧道封装。但非同一个二层网络上的节点上的Pod间通信,仍须隧道封装。
host-gw:Pod与Pod不经隧道封装而直接通信要求相关节点位于同一个二层网络
通常,在一个节点上,基于该节点的子网向该节点上的Pod分配IP地址,通常需要专门的插件完成;
插件统称:IPAM(IP分配模块)
1234567891011121314151617181920212223242526272829303132333435363738# flanel相关配置---kind: ConfigMapapiVersion: v1metadata ...
k8s网络
k8s主要存在四种类型的网络通信:
C-to-C:发生在Pod内部,借助于lo实现;
Pod-to-Pod:Pod间的通信,k8s自身并未解决该该类通信,而是借助于CNI接口,交给第三方解决方案;CNI之前的接口叫kubenet;
Service-to-Pod:借助于kube-proxy生成的iptables或ipvs规则完成;
ExternalClients-to-Service:引入集群外部流量,hostPort、hostNetwork、nodeport/service、loadbalancer/service、externalIP/service、Ingress;
k8s通过CNI接口将Pod-to-Pod间的通信交由第三方网络的原因在于,跨节点的容器间通信不能存粹的物理桥接,这样会造成一个网段内挤入太多的物理节点。这样会产生网络风暴,所以必须将其进行隔离。
隔离的方法就是把每一个节点及其背后的Pod作为一个小的网络来使用。而此时跨节点的Pod通信就变为了如何去突破Pod所在的节点的边界。也就是如何去实现跨节点的Pod间的路由。
Pod跨界点通信解决方法要构建出一个跨节点 ...
dashboard admin-user
dashboard admin-user资源配置清单。
12345678910111213141516171819apiVersion: v1kind: ServiceAccountmetadata: name: admin-user namespace: kubernetes-dashboard---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: admin-userroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-adminsubjects:- kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard
准入控制器
k8s的整体认证过程分为3步,本别是认证、授权、准入控制。认证和授权都是工作在短路模式,而准入控制是非短路模式,但拥有一票否决权力,如果其中任何一个准入插件拒绝那其操作就无法执行,但是它会继续向下执行直到检查完每一个准入插件以确保能分析出有哪些步骤发生错误。
k8s支持的准入控制器有数十种之多,但是有3个非常关键:
limitranger: 为Pod添加默认的计算资源需求和计算资源限制;以及存储资源需求和存储资源限制;支持分别在容器和Pod级别进行限制;
resourcequota:限制资源数量,限制计算资源总量,存储资源总量;资源类型名称ResourceQuota。
podsecuritpolicy:在集群级别限制用户能够在Pod上可配置使用的securityContext。
limitrangerlimitrange与此前在pod上做资源限制的配置方式相同,所不同的是它是在名称空间上做的所有设定.
如果pod没有定义资源限制,则会继承该名称空间上的limitrange中的定义。
示例1.创建一个limitrange资源清单
123456789101112131415161718 ...
授权
在k8s的1.21.2版本上默认使用的是Node和RBAC。
123456# kubeadm部署的k8s可以在/etc/kubernetes/manifests下查看到静态pod的yaml文件root@k8s-master01:/etc/kubernetes/manifests# grep authorization kube-apiserver.yaml - --authorization-mode=Node,RBAC# Node是专用于向kubelet授权使用。# RBAC是基于角色的范文控制
常用授权逻辑DAC(自主访问控制)、MAC(强制访问控制)、RBAC(基于角色的访问控制)、ABAC(基于属性的访问控制)
RBACRBAC:Role-Based Access Control
在一个组织内把一个组织内应该具有的权限的集合定义成多个角色,然后设定某个用户可以扮演其中1到多个角色。从而让某个用户对应的拥有在组织内的授权。
k8s的RBAC是一种许可授权,只允许用户做什么事情,默认拒绝所有。未显式指定授予的权限,默认都会被拒绝。
12345Role --> Ver ...
dashboard部署
官方文档https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard/
Dashboard是基于网页的Kubernetes用户界面。 你可以使用Dashboard将容器应用部署到Kubernetes集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用Dashboard获取运行在集群中的应用的概览信息,也可以创建或者修改Kubernetes资源 (如Deployment,Job,DaemonSet等等)。 例如,你可以对Deployment实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
Dashboard同时展示了Kubernetes集群中的资源状态信息和所有报错信息。
部署 Dashboard UI默认情况下不会部署Dashboard。可以通过以下命令部署:
1kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended ...
kubectl命令使用
kubernetes创建容器分为命令式和声明式,以下为命令创建容器的使用方法
创建容器在k8s集群上运行一个容器
1234567891011121314151617# 使用kubectl创建podroot@k8s-master01:~# kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0deployment.apps/demoapp created# 容器创建中root@k8s-master01:~# kubectl get podsNAME READY STATUS RESTARTS AGEdemoapp-5f7d8f9847-v7ft8 0/1 ContainerCreating 0 11s# 使用-o wide显示更详细信息root@k8s-master01:~# kubectl get pods -o wideNAME READY STAT ...
kubectl命令自动补全
安装bash-completion
12345678# ubuntu安装bash-completionapt install bash-completion# centos安装bash-completionyum install bash-completion -y# 重读配置文件source /usr/share/bash-completion/bash_completion
配置k8s命令自动补全
12345source <(kubectl completion bash)echo "source <(kubectl completion bash)" >> ~/.bashrc# 以上命令可以通过以下命令查询获得kubectl completion --help
多kubeconfig文件合并
当存在多个kubeconfig文件时,我们可以将其进行合并使用。
当前系统上存在2个kubeconfig文件
1234567891011121314151617181920212223242526272829303132333435363738394041424344# kubeconfig文件1root@k8s-master01:~# kubectl config viewapiVersion: v1clusters:- cluster: certificate-authority-data: DATA+OMITTED server: https://kube-api:6443 name: kubernetescontexts:- context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetescurrent-context: kubernetes-admin@kuberneteskind: Configpreferences: {} ...
自建账号及认证
X509认证1.创建出用户的私钥
12345678910# 创建一个存放用户证书的目录root@k8s-master01:/etc/kubernetes# mkdir usercertsroot@k8s-master01:/etc/kubernetes# cd usercerts/# 创建一个私钥root@k8s-master01:/etc/kubernetes/usercerts# (umask 077; openssl genrsa -out masuri.key 2048)Generating RSA private key, 2048 bit long modulus (2 primes)...........................................................+++++.....................+++++e is 65537 (0x010001)
2.基于私钥创建一个证书签署请求,此签署请求需要被k8s的CA所签署
1234# 生成证书签署请求,需要注意此处CN将会被做为用户名,O将会被作为组名使用root@k8s ...