第一天:
上午
Master节点:
etcd:存储整个集群元数据
kube-apiserver: k8s组件通信接口,通过http/https协议通信
kube-scheduler:
kube-controller-manager:
Route Controller
Service Controller
Deployment Controller
Volume Controller
Node Controller
ReplicaSet Controller
Daemonset Controller
StatefulSet controller
........等
Node节点:
kube-proxy:
kubelet: 包含三个接口
CNI:容器网络接口,提供容器网络功能
CSI:容器存储接口,提供容器存储功能
CRI:容器运行时接口,提供容器接口功能
pod是k8s最小单元,一个pod内可以运行多个容器。
运行应用:
Controller
apiService
声明式配置:【面向对象】 k8s中的配置项采用的声明式配置。
简单的理解就好比打车,直接告诉司机目的地去万达。至于司机怎么加油,转弯,踩刹车整个过程我们不用关心,我们只用关心成功到达目的万达就可以。
过程式配置:【面向过程】
同样是打车,上了车之后要告诉师傅,起步,踩油门,打方向,然后再右拐,最后告诉师傅下车我到万达了。
ApiService
Controller对象 [RS(ReplicaSet)/Deployment/Daemonset/StatefulSet/job/cronjob/]
Service对象 [Sevice Pod资源调度器]
label Selector标签选择器
pod定义label
定义多个pod
kubeadm部署k8s
master节点:
kube-apiserver,kube-controller-manager,kube-scheduler,etcd
worker节点:
kubelet,kube-proxy,docker
要点:每个节点都要部署docker,kubelet,kubeadm,kubectl可以单独在管理节点中部署。
阿里云镜像仓库:
https://developer.aliyun.com/mirror
https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b11IzX5Le
kubeadm init --help #查看安装过程
swapoff -a
kubeadm config images pull #提前下载好镜像
kubeadm init --image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.4 \
--control-plane-endpoint kubeapi.magedu.com \
--apiserver-advertise-address 192.168.10.1 \ #master节点IP
--pod-network-cidr 10.244.0.0/16 \ #flannel和calico默认网段不一样
--token--ttl 0 #永不过期
kubectl get cs #查看控制组件是否Running 1.19+之后这个命令被废弃
kubectl api-resources #查看所有资源。
kubeadm reset #清理当前集群
docker 默认Cgroup Driver为cgroup,但是在kubernetes1.14之后的版本推荐使用systemd,对于18.x.x版本的docker来说是相对比较简单的,只需要修改/etc/docker/daemon.json的配置就可以配置docker的cgroup驱动。
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"exec-opts": ["native.cgroupdriver=systemd"], #只需要这一个配置即可。
"max-concurrent-downloads": 20,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"data-root": "/var/lib/docker"
}
time docker pull node:latest #可以测试镜像下载速度
vim /etc/sysctl.d/k8s.conf #新增配置,解决node节点部署失败问题。
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
sysctl -p
sysctl -a
kubectl create deployment demoapp --image='ikubernetes/demoapp:v1.0' --dry-run=client #测试运行
kubectl create deployment demoapp --image='ikubernetes/demoapp:v1.0'
kubect scale deployment demoapp --replicas=3 #把刚刚生产的pod,扩容到3副本。
kubectl create service clusterip demoapp --tcp=80:80 #pod删除后ip会改变,可以创建server,通过server来访问对应的pod
下午
底层平台,Hardware,OS,
镜像:分层构建,aufs,overlaysf2,
k8s上的运行的组件:
master node
API Server #所有的交互已apiserver为中心。
Controller Manager
Scheduler
Etcd
worker node
kubelet
kube-proxy
container engine
Add-ons
KubeDNS:CoreDNS
Dashboard,Web UI
监控系统:prometheus
日志系统:EFK,LG
Ingress Controller
第二天,第一节
docker:network,IPC,UTS
命令式命令:
命令,及其选项(从选项中读取配置数据)来实现
命令式配置文件:
命令,从配置文件加载配置数据
声明式配置文件:
声明式命令,从配置文件加载配置数据。
YAML--->JSON
apiVersion: ... #资源对象所属的API群组及版本
kind: ... #资源类型
metadata:
... #资源对象的元数据
spec:
... #所需状态,或称为期望状态
status:
... #暂且忽略。
查看k8s中API群组及版本:
kubectl get api-versions
查看pod详细解释:
kubectl explain pod
vim myspod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
labels:
app: mypod
release: canary
spec:
containers:
- name: demoapp
image: ikubernetes/demoapp:v1.0
# k8s中存在三种网络模型;
节点网络、集群网络(service网络)、pod网络;
# k8s 5中通信模型:
同一pod内容器间通信、同一节点pod到间pod通信、跨主机间pod通信、pod到service通信、集群外部到service的通信;
1,第一类客户端
Application clients--->NodePort--->Service--->pod
Application Clients--->Ingress--->pod #中间借助Service来找到对应的pod,直接通过Ingress和pod通信
2,第二类客户端
Developers/Operators--->Apiserver--->pod client #对集群做一些增删改查操作等
RESTful API,Https
资源类型,schema
Pod,Deployment,Service
对象,object
资源规范
apiVersion,Kind,metadata,spec(期望状态),status(实际状态)...
控制器:负责确保将实际状态这顶不断逼近或等同于期望状态
Control Loop:如果实际状态和期望状态不一致,会启动控制循环,至到一致。
create,delete,change,
namespace级别资源:
工作负载型资源(workload),Pod
stateful,stateless,
Deployment,DaemonSet,StatefulSet-->Operator
Job,Cronjob,
服务发现和负责均衡
Service,Ingress
配置和存储
ConfigMap/Secret
PVC/PV
Downward API
role,rolebinding
集群级别的资源
namespace,node,clusterrole
元数据类型
LimitRange,...
通过explain命令查看资源类型及所属群组:
kubectl api-versions #查看所有资源类型
kubectl explain configmap #查看属于的群组 V1
kubectl explain deployment #apps/v1群组
通过命令查看资源
kubeapi.magedu.com:6443/apis/apps/v1/namespaces/default/deployments/demoapp
kubeapi.magedu.com:6443 #apiserver监听的地址
apis #通用名称/核心群组是api开头,其它都是apis
apps #群组名
v1 #版本名
namespaces #指定名称空间
default #名称空间名称
deployments #资源类型名称
demoapp #pod名称
/apis/GROUP/VERSION/namespaces/NAMESPACES/{pods,deployments,stateless...}/POD_NAME
kubectl get --raw /apis/apps/v1/namespaces/default/deployments/demoapp #--raw指以json格式输出
kubectl get --raw /apis/apps/v1/namespaces/default/deployments/demoapp | jq . #jq解析json美化输出
kubectl get --raw /apis/apps/v1/namespaces/default/deployments/demoapp | jq .metadata.name #查看指定资源的value
jq安装,jq在epel源中
yum -y install epel-release
yum -y install jq
curl和kubectl两种请求方式:
curl kubeapi.magedu.com:6443/apis/apps/v1/namespaces/default/deployments/demoapp #获取失败,应为需要客户端做ca双向认证。否则面向互联,所有人都可以通过我们的apiserver访问,做增删改查。
kubectl proxy 可以理解为https认证卸载器,可以借助kubectl proxy 和apiservice建立通信。然后本地来访问
]# kubectl proxy
Starting to serve on 127.0.0.1:8001
]# culr 127.0.0.1:8001 #成功加载所有信息
]# curl 127.0.0.1:8001/api/v1/namespaces/default/pods/mypod #查看核心群组下pod信息。输出信息是已解析后json美化显示
kubeadm方式部署,认证文件默认保存在/etc/kubernetes/admin.conf,
需要复制到当前用户家目录下及.kube目录下改名为config才会自动加载授权认证。
]# mkdir -p $HOME/.kube
]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl -help
kubectl options #通过帮助命令获取k8s更多参数含义
--kubeconfig='' #也可以通过kubectl --kubeconfig=/etc/kubernetes/admin.config get pod 指定config配置文件。
------
cat mypod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
labels:
app: mypod #<map[string]string>
release: canary #<map[string]string>
spec:
containers:
- name: demoapp #<[]Object>
image: ikubernetes/demoapp:v1.0
- name: nginx #<[]Object>
image: nginx:1.16-alpine
----
apiVersion、kind、metadata、spec为4个顶级字段,其中最为复杂的就是spec;
kubectl explain pods
kubectl explain '类型名称‘ #来查看每个资源所支持的参数及含义
kubectl explain pods.metadata
<string> 字符类型
<object> 但凡是对象类型都有2级字段
<map[string]string>字典型数据/映射型数据,就是key:value
kubectl explain pods.spec
containers <[]Object> 在yaml中表示列表,在yaml中以列表可以内嵌多个对象。
kubectl explain pods.metadata #二级对象用'.'来分割,来查看二级字段支持的参数
kubectl get pods mypod -o yaml --export # --export k8s.1.18之前的版本可以用
资源引用格式:
<type>/<name>: pods/mypod,deployment/demoapp #同时支持多种不同的资源类型
<type> <name>: pods mypod,deployment demoapp #如果一次引用多个资源时这中模式就不支持。
例如:
kubectl delete pods/mypod pods/testpod deployment/demoapp
kubectl delete pods mypod testpod #同一pods资源类型下可以删除多个pod,不能同时删除不同资源类型下的pod
node资源和pod资源及具体使用方法: