基础概念

集群架构

  • 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容器

    • 用于Pod内部网络通信
  • 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服务

  • 打Jar包
1
2
3
4
5
sudo apt install maven

git clone https://github.com/libinkai/k8s-demo.git

mvn package
  • 构建Docker镜像
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

常用命令

  • 查看node、pod
1
kubectl get pods -o wide|json
  • 查看详情
1
kubectl describe pod pod-name
  • 查看log
1
kubectl logs pod-name -f
  • 进入Pod容器终端,c参数进入指定容器
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不会处理数据的存储,需要自行挂载存储,有如下几种
    • 本地磁盘
    • 云存储
    • NFS
  • 存储的架构
    • Persistent Volume Claim (PVC),对存储需求的一个申明,可以理解为一个申请单,系统根据这个申请单去找一个合适的 PV(使用者关心)
    • Persistent Volume (PV),描述卷的具体信息,例如磁盘大小,访问模式(集群运维者关心)
    • Storage Class (SC),将存储卷划分为不同的种类,例如:SSD,普通磁盘,本地磁盘,按需使用

相关文档