chapter1 kubernetes fundamentals
kubernetes解决了什么问题
保障高可用性,自动健康检查并重新起来一个被销毁的容器
处理版本发布以及容器部署
kubectl set image <deployment_name> <container_name>=<docker_image>:<docker_tag>
自动扩容
chapter2 kubernetes architecture from docker images to running pods
项目
master node 和workerNode
一般来说,windows可以启动windows的docker,linux可以搞linux的docker,反之则不一定成功。k8s由一系列的小project组成。因此你需要一个个的部署。分开部署有助于高可用以及对生命周期的各自规划
control plan
用于维护cluster的状态,一般在master节点上。但也可以在worker node上
worker nodes
用于和docker daemon交互。处理包括如创建容器,网络管理,扩缩容容器
重要概念
- Pod
- ReplicaSet
- PersistentVolume
- NetworkPolicy
- Deployment
kubeadm实际安装, minikube 用作测试 ,Kubernetes the Hard Way, 时实际从裸机上如何安装k8s,不推荐
kube-apiServer
apiServer实际负责了与外部的交互,虽然看起来api-server就是k8s的全部,但实际上不是。
apiServer接收的时http请求,利用rest风格
默认端口6443(https)
systemd自动启动
vim /etc/systemd/system/kube-apiserver.service
systemctl daemon-reload
systemctl enable kube-apiserver
systemctl start kube-apiserver
完成后检查 /etc/systemd/system/kube-apiserver.service
kubectl command line tool
#版本号
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.14.10/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
$ kubectl version # Should output kubectl version
minikube拉取镜像失败问题
sudo vim /etc/docker/daemon.json
#添加下面到daemon.json文件中
{
"registry-mirrors": ["https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","http://f1361db2.m.daocloud.io"]
}
kubectl 和http本质上时一样的。
kubectl run nginx --restart Never --image nginx
kubectl remove pods nginx
yaml格式
kubectl run my-pod --restart Never --image busybox:latest
kubectl get rs -n my-namespace
kubectl delete pods my-pod
yaml格式具备可重复使用的特点
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: busybox-container
image: busybox:latest
apiVersion 描述了当前资源声明的api版本号
kind 描述了希望创建的资源类型
metadata 主要是一些元信息,但是这个时给k8s用的,而非docker使用的
spec描述了物理的一些资源。如containers有几个container,名字,image是什么
创建与删除pod
#创建
kubectl create -f pod.yaml
# 删除
kubectl delete -f pod.yaml
etcd
etcd为第三方组件
kubeapi-service目前只能依赖etcd,不能依赖如mysql等
etcd最好能部署在专门的机器上,但如果条件不允许,也可以与control plan内的其他机器部署在一起。
kubelet and worker node componentes
The container engine 如docker daemon
kubelet agent kubelet的代理
k8s启动时,会读取/etc/kubernetes/kubelet.conf文件
一旦接入k8s集群,kubelet就会作为k8s 和docker daemon的桥梁,每20s 或者监听api kubelet上报给k8s一个消息(GET),然后k8s发送一些对应的需要创建的消息返回给kubelet,kubelet就能实际的告诉docker daemon取创建(利用socket) 注意master为6443端口,必须要能够联通
kubelet实际上与api-server通信,而非直接与etcd通信。
kube-proxy
service实际上由kube-proxy组件来执行,就想kubelet一样,它同样与kube-apiserver做实际的交互。
other 如 cAdvisor or Container Network Interface
kube-scheduler
需要在master上运行,需要高可用,实际过程与kube-apiserver交互,找到没有被规划的pod ,如果pod包括了nodeName,就意味着已经被规划了,否则就是在pending,kube-scheduler就是找到这个nodeName,(定期,事件)
如何筛选
node selector
Node affinity 以及 anti-affinity
taint and toleration
注意要高可用
kube-controller-manager
需要在master上运行,用于做reconciliation loop,试图去维持etcd中的状态与实际集群中状态的差异到最小值
具体举例如
- NodeController
- NamespaceController
- EndpointsController
- ServiceaccountController
如何使得kubenetes高可用
k8s组件
搭建k8s
Chapter 3: Installing Your First Kubernetes Cluster - The Kubernetes Bible [Book]
minikube
curl -LO https://dl.k8s.io/release/v1.23.8/bin/linux/amd64/kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
sudo usermod -aG docker $USER && newgrp docker
kubectl get componentstatuses
minikube status
minikube start --driver=docker --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --kubernetes-version=1.23.8
kind
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.8.1/kind-$(uname)-amd64
chmod +x ./kind
mv ./kind /usr/local/bin/kind
#创建
kind create cluster
kind delete cluster
#文件创建
vim ~/.kube/kind_cluster
#文件内容
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
#创建
kind create cluster --config ~/.kube/kind_cluster