学习kubernetes即相关操作

背景:

        随着将程序或者服务部署到容器中后,会带来新的问题,例如:随着服务规模扩大,如何进行容器的扩展?

        如何在容器之间分担负载?如何添加新的服务器?

        如何在不影响程序或者服务内容的情况下进行更新?,能否支持版本回退?

        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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值