背景:
随着将程序或者服务部署到容器中后,会带来新的问题,例如:随着服务规模扩大,如何进行容器的扩展?
如何在容器之间分担负载?如何添加新的服务器?
如何在不影响程序或者服务内容的情况下进行更新?,能否支持版本回退?
kubernetes的出现就可以解决这些问题。
一、kubernetes简介
Kubernetes是一个全新的基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统,受到了先前谷歌内部Borg很大程度的影响,borg是谷歌内部使用的大规模集群管理系统,目的将多个数据中心的资源利用率最大化。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和自动更新等一系列完整功能,提高了大规模容器集群管理的便捷性,简单来说,K8S就是一款容器编排工具。
K8s的优点:
可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
可扩展: 模块化, 插件化, 可挂载, 可组合
自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
二、kubernetes的基本概念
一个典型的k8s集群由多个worker node和一个master以及一个集群状态存储系统,即etcd组成,master负责整个集群的管理工作,为集群提供管理接口,并监控和编排集群中的各个工作节点,各节点负责以pod的形式运行容器,因此,各节点需要事先配置好容器运行依赖的所有服务和资源。k8s有如下几个重要概念。
1.cluster
Cluster 是集群的意思,是计算、存储和网络资源的集合,Kubernetes 利用这些资源运行各种基于容器的应用。由若干台master和node组成,最简单的情况下可以只有一个master节点。
2.master
主节点masternode控制整个集群,是指挥中心。其中包括如下组件。
(1)kubectl:通过kubetcl来执行资源的增、删、改、查等操作。
(2)APIserver:kubetcl是通过APIserver来去执行这一系列管理动作的,它为操作资源、对象提供统一访问的入口。
(3)etcd:对集群中的资源、对象进行持久化存储,主要包括Node、Service、Pod、RC、Namespace等。
(4)Scheduler:负责整个Pod资源的调度。
(5)Controller-manager:实时监控整个集群资源对象的当前状态。
3.node
容器应用会运行到node节点中,并根听从Master 的指令对容器应用进行管理。其中包括以下组件。
(1)kubelet: 负责Pod对应的容器的创建、启动、停止等任务,同时与Master节点一起管理集群.
(2)Kube-proxy:负责内外的通信。
4.pod
K8S 调度、管理的最小单位,一个 Pod 可以包含一个或多个容器,每个 Pod 有自己的虚拟IP。一个工作节点可以有多个 pod,主节点会考量负载自动调度 pod 到哪个节点运行。
三、kubernetes的基础操作
尝试搭建一个kubernetes集群
分为三种方法
一、minikube
只是一个 K8S 集群模拟器,只有一个节点的集群,只为测试用,master 和 worker 都在一起。安装十分简单,先决条件是安装好docker。
首先安装kubectl.
kubernetes官网kubectl教程:https://kubernetes.io/docs/tasks/tools/install-kubectl/
下载kubectl工具:
Curl -LO https://storage.googleapis.com/kubernetesrelease/release/v1.15.0/bin/linux/amd64/kubectl
添加执行权限
chmod +x ./kubectl
添加到PATH路径
sudo mv ./kubectl /usr/local/bin/kubectl
查看是否安装
kubectl version
安装minikube
二、用厂商的云平台搭建集群
可视化搭建,只需简单几步就可以创建好一个集群。可以选择各种规模的集群。
优点:安装简单,生态齐全,负载均衡器、存储等都给你配套好,简单操作就搞定。
这里选择阿里云的k8s集群产品,产品内部搜索kubernetes既能找到。
创建过程中需要创建自己的专有网络以及交换机,并且要开通几项服务,包括日志服务,普罗米修斯监测服务,文件存储服务等。选择按量付费,对于个人学习来说更加实惠。
最后会有搭建之前的检查,检查状态均为通过才可以搭建。创建成功后即可看到自己的集群状态。
三、裸机搭建
至少需要两台机器,一台为master,一台为node,本次我采用在云厂商购买三台机器来进行学习(这里至少要购买两核CPU的机器,不然最后创建集群会失败),分别命名为master,node1,node2.。裸机搭建需要自己安装kubernetes的组件,配置相对复杂。相对于云平台搭建来说这种方法有着明显缺点,例如配置麻烦,缺少生态支持,例如负载均衡器、云存储。
根据上文的k8s结构图,master节点和node节点分别需要不同的组件。
主节点需要组件
docker(也可以是其他容器运行时)
kubectl 集群命令行交互工具
kubeadm 集群初始化工具
工作节点需要组件 文档
docker(也可以是其他容器运行时)
kubelet 管理 Pod 和容器,确保他们健康稳定运行。
kube-proxy 网络代理,负责网络相关的工作
但为了安装方便,选择在三台
机器上都将工具安装齐。
安装流程
首先先用Xshell远程登录一下创建的三台虚拟机,分别命名为master,node1,node2.
1,每个节点分别设置对应主机名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
2,所有节点都修改 hosts ,这里的IP为三台机器的内网IP
vim /etc/hosts
172.16.32.2 node1
172.16.32.6 node2
172.16.0.4 master
3,所有节点关闭 SELinux
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
4,所有节点确保防火墙关闭(实例好像防火墙本身就是关着的)
systemctl stop firewalld
systemctl disable firewalld
5,所有节点添加 k8s 安装源
cat <<EOF > kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
mv kubernetes.repo /etc/yum.repos.d/
6, 所有节点添加 Docker 安装源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
这里可能会出现错误信息:yum-config-manager: command not found
原因是因为系统默认没有安装这个命令,这个命令在yum-utils 包里,可以通过如下命令来安装。
yum -y install yum-utils
7,所有节点安装所需组件
yum install -y kubelet kubeadm kubectl docker-ce
正常来说使用上述命令会将四个工具的最新版本安装到机器上,但kubernetes在今年发布了新版本1.24,在此版本之后k8s将不再支持docker,如果想继续使用docker的话需要添加一个cri-docker的中间层,cri-docker是一个支持CRI标准的shim.,但很明显加入这个中间层后会使效率变低。所以我选择了指定版本进行安装。
yum install -y kubelet-1.22.4 kubectl-1.22.4 kubeadm-1.22.4 docker-ce
8,所有节点启动 kubelet、docker,并设置开机启动
systemctl enable kubelet
systemctl start kubelet
systemctl enable docker
systemctl start docker
9,所有节点修改 docker 配置
cat <<EOF > daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
}
EOF
mv daemon.json /etc/docker/
#重启
systemctl daemon-reload
systemctl restart docker
10,在master节点初始化集群
kubeadm init --image-repository=registry.aliyuncs.com/google_containers
出现了报错:/proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
执行下方语句可以解决
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
master节点运行完指令之后最后会出现kubeadm join XXXXXX 的语句,需要保存下来用于将工作节点加入集群。
10, 复制授权文件,以便 kubectl 可以有权限访问集群
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
11,把工作节点加入集群 就是把刚才复制的那句话粘贴到node节点中
kubeadm join 172.16.32.10:6443 --token xxx --discovery-token-ca-cert-hash xxx
12,加入成功后安装flannel网络插件,不然状态栏会一直显示notready,需要科学上网
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
这样就完成了手动创建集群的工作。
尝试部署一个文件
使用vim创建一个app.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-k8s
spec:
replicas: 2
selector:
matchLabels:
app: test-k8s
template:
metadata:
labels:
app: test-k8s
spec:
containers:
- name: test-k8s
image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1
用命令kubectl apply –f app.yaml部署,报错,显示:
networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default" network: open /run/flannel/subnet.env: no such file or directory
网上搜索发现是flannel插件的问题,创建文件/run/flannel/subnet.env后写入如下语句:
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
最后重试,使用kubectl get pod 查看部署情况.
Kubectl的一些命令:
部署应用
kubectl apply -f app.yaml
查看 deployment
kubectl get deployment
查看 pod
kubectl get pod -o wide
查看 pod 详情
kubectl describe pod pod-name
查看 log
kubectl logs pod-name
进入 Pod 容器终端, -c container-name 可以指定进入哪个容器。
kubectl exec -it pod-name -- bash
伸缩扩展副本
kubectl scale deployment test-k8s --replicas=5
把集群内端口映射到节点
kubectl port-forward pod-name 8090:8080
查看历史
kubectl rollout history deployment test-k8s
回到上个版本
kubectl rollout undo deployment test-k8s
回到指定版本
kubectl rollout undo deployment test-k8s --to-revision=2
删除部署
kubectl delete deployment test-k8s
查看全部
kubectl get all
重新部署
kubectl rollout restart deployment test-k8s
命令修改镜像,--record 表示把这个命令记录到操作历史中
kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record
暂停运行,暂停后,对 deployment 的修改不会立刻生效,恢复后才应用设置
kubectl rollout pause deployment test-k8s
恢复
kubectl rollout resume deployment test-k8s
输出到文件
kubectl get deployment test-k8s -o yaml >> app2.yaml
删除全部资源
kubectl delete all --all