基础概念
集群架构
- master,主节点,控制平台,一般不运行任务
- worker,工作节点
组件
- etcd,分布式键值系统
- api server,集群的统一入口,协调各组件,以HTTP API提供接口服务。所有对象资源的增删改查、监听操作都交给APIServer处理后再由Etcd存储
- scheduler,根据调度算法为新创建的Pod选择一个Node节点
- controller-manager,处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的
- cloud-controller-manager
- Kubelet,kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷等
- Kube-Proxy,在Node节点上实现Pod网络代理,维护网络规则和负载均衡工作
- Docker,运行容器
资源
Pod
- K8S调度、管理的最小单位,一个Pod可以包含一个或者多个容器。一个工作节点可以有多个pod。
Label&Selector
Pause容器
Replication Controller
- 副本控制器,RC与ReplicaSet、Deployment三者组成Replication Controller
Deployment
StatefulSet
- 有状态集群
- 名称有序,增加时顺序,减少时逆序
- 重建后名称不变,但是IP变化,推荐搭配Service的None使用
Service
- 提供统一的服务访问入口、服务代理、服务发现
- 通过标签关联对应的pod,生命周期不与Pod绑定,不会因为Pod的重新创建而改变IP
- 提供负载均衡功能
- 种类
- ClusterIP,集群内部可以访问(默认模式)
- NodePort,节点可以访问
- LoadBalancer,负载均衡模式,需要云服务商的负载均衡器才能使用
- None:不分配IP,只使用名字访问
NameSpace
Volume
Endpoint
- 逻辑概念,标识服务进程的访问点
- Pod的IP+容器端口=Endpoint
DaemonSet
- 在每个节点上跑一个 Pod,可以用来做节点监控、节点日志收集等
Job & CronJob
- Job 用来表达的是一次性的任务,而 CronJob 会根据其时间规划反复运行
安装
minikube
实验版
云厂商版K8S
- master节点由云厂商运维,只需要部署worker节点
kubeadm
Ubuntu 20.04、Docker 20.10.12、K8S 1.17.3
安装软件源
1 2 3 4 5
| curl -fsSL http://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo add-apt-repository "deb http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main"
sudo apt-get update
|
安装组件
1
| sudo apt-get install -y kubelet=1.17.3-00 kubeadm=1.17.3-00 kubectl=1.17.3-00
|
准备工作
- 关闭交换空间
- 安装docker
- 配置docker
1 2 3 4
| # /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] }
|
引导
1 2 3
| sudo systemctl start kubelet
sudo systemctl enable kubelet
|
1
| kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version v1.17.3 --apiserver-advertise-address <NET_INTERFACE_IP>
|
用户权限配置
1 2 3
| mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
|
配置网络
这个必须配置,否则节点是NotReady状态
1
| curl --insecure -sfL https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml | kubectl apply -f -
|
命令补全
1 2
| echo 'source <(kubectl completion bash)' >> ~/.bashrc echo 'source /usr/share/bash-completion/bash_completion' >> ~/.bashrc
|
实战
部署Java服务
1 2 3 4 5
| sudo apt install maven
git clone https://github.com/libinkai/k8s-demo.git
mvn package
|
1
| docker build -t equator/k8s-demo .
|
1 2 3 4 5 6 7 8 9
| # 登录 docker login --username=$user_name registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/equator-demo/k8s-demo:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/equator-demo/k8s-demo:[镜像版本号]
# 集群授权 kubectl create secret docker-registry [$Reg_Secret] --docker-server=[$Registry] --docker-username=[$Username] --docker-password=[$Password] --docker-email=[$Email]
|
单Pod部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| apiVersion: v1 kind: Pod metadata: name: pod-demo spec: containers: - name: java-demo image: registry.cn-hangzhou.aliyuncs.com/equator-demo/k8s-demo:1.0.0 ports: - containerPort: 8080 imagePullSecrets: - name: aliyun
// 部署 kubectl apply -f pod.yaml
// 查看 kubectl get pods
// 测试 curl http://10.244.1.8:8080/api/v1/test/ip
// 删除 kubectl delete pod/pod-demo
|
Deployment部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| apiVersion: apps/v1 kind: Deployment metadata: name: deployment-demo labels: app: java-demo spec: replicas: 3 selector: matchLabels: app: java-demo template: metadata: labels: app: java-demo spec: containers: - name: java-demo image: registry.cn-hangzhou.aliyuncs.com/equator-demo/k8s-demo:1.0.0 ports: - containerPort: 8080 imagePullSecrets: - name: aliyun
|
常用命令
1
| kubectl get pods -o wide|json
|
1
| kubectl describe pod pod-name
|
1
| kubectl logs pod-name -f
|
1
| kubectl exec -it pod-name --bash [-c 容器名]
|
1
| kubectl scale deployment deployment-name -replicas=5
|
1
| kubectl rollout history deployment xxx
|
1
| kubectl port-forward pod-name port:port
|
1
| kubectl rollout undo deployment xxx [--to-revision=2]
|
1
| kubectl delete deployment xxx
|
1 2 3
| kubectl get all
kubectl delete all --all
|
1
| kubectl rollout restart deployment test-k8s
|
- 暂停与恢复,暂停后,对 deployment 的修改不会立刻生效,恢复后才应用设置
1 2 3
| kubectl rollout pause deployment test-k8s
kubectl rollout resume deployment test-k8s
|
数据持久化
- K8S不会处理数据的存储,需要自行挂载存储,有如下几种
- 存储的架构
- Persistent Volume Claim (PVC),对存储需求的一个申明,可以理解为一个申请单,系统根据这个申请单去找一个合适的 PV(使用者关心)
- Persistent Volume (PV),描述卷的具体信息,例如磁盘大小,访问模式(集群运维者关心)
- Storage Class (SC),将存储卷划分为不同的种类,例如:SSD,普通磁盘,本地磁盘,按需使用
相关文档