• Kubernetes初探


    在部署公司的告警系统Prometheus时,看到很多博客都在用k8s,这里也学习一下,其实几年前都想学,因为种种原因搁置到现在,惭愧

    这里先说一下k8s,是一种容器编排软件,什么是编排?我理解的是:用了docker后,发现软件发布变得方便极了,但同时,如果想要扩展、备份就需要收到写一些脚本什么的,所以k8s就来了。官网关于k8s的定义是容器化集群管理系统。原文:
    Kubernetes is a portable, extensible, open source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation。
    那么Kubernetes 都能干什么呢?
    在这里插入图片描述
    也就是:

    1. 服务发现、负载均衡
    2. 存储编排
    3. 滚动更新、回退
    4. 资源自动装箱
    5. 自我修复
    6. 密钥和配置管理

    总之这些都是一个健壮的系统所需要的东西。可以先不理解,在官网的互动教程中学习使用,比如Learn Kubernetes Basics 中,有关于replica的操作,根据操作来加深理解。我目前也只学了Learn Kubernetes Basics,在自己的电脑装了minikube,准备把其他的教程能看的都看一看。
    这里写一下,初次装minikube,所需要的步骤,毕竟踩了很多坑,花了很长时间才装好。

    # 自己的虚拟机装的是centos7.9 minimal。装好后先改下yum的源,我一般用tuna的源 :
    # 对于 CentOS 7
    sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
             -e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g' \
             -i.bak \
             /etc/yum.repos.d/CentOS-*.repo
    
    # 对于 CentOS 8
    sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
             -e 's|^#baseurl=http://mirror.centos.org/$contentdir|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos|g' \
             -i.bak \
             /etc/yum.repos.d/CentOS-*.repo
    # 更新软件包缓存
    sudo yum makecache
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    下面开始正式的步骤:

    1、装docker,请参照官网。新建用户kube,配置sudo权限

    # 添加用户
    adduser kube
    # 修改权限
    nano /etc/sudoers
    kube    ALL=(ALL)      NOPASSWD: ALL
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、配置docker镜像仓库

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://hj3oa7u5.mirror.aliyuncs.com"]
    }
    EOF
    # 重启docker
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    # 设置docker 开机自启动
    sudo systemctl enable docker.service
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3、配置yum kubernetes仓库

    # 把gpgcheck设置为0,关掉gpg签名,要不然也会报错
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=1
    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
    # 更新下 yum
    yum clean all
    yum -y makecache
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4、安装 kubelet kubeadm kubectl(按理说我用的minikube,不用装这些,但是不装启动不了)

    https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
    # Set SELinux in permissive mode (effectively disabling it)
    sudo setenforce 0
    sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    sudo systemctl enable --now kubelet
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5、关闭一堆防火墙/内存交换和命令补全

    # 关闭防火墙
    sudo systemctl stop firewalld
    # 开机也不要启动firewalld
    sudo systemctl disable firewalld.service
    # 如果不想关闭,也可以这样开放某个端口
    # 因为 kubectl proxy 默认是8001,在开启minikube dashboard时,我这样
    # kubectl proxy --port=8001 --address='192.168.56.105' --accept-hosts='^.*' &
    # 但是怎么都访问不通,在本地curl可以,后来才知道是firewall给拦截了,费了很长时间才知道
    firewall-cmd --zone=public --add-port=8001/tcp --permanent
    firewall-cmd --reload
    
    # 关闭内存交换
    sudo swapoff -a
    # 永久禁用
    sed -i.bak '/swap/s/^/#/' /etc/fstab
    
    # 内核参数修改(这一步我也不知道为啥)
    [root@master ~]# cat <  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    [root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf
    
    # kubectl 自动补全
    [root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bash_profile
    [root@master ~]# source .bash_profile 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    6、启动小提示

    # --image-mirror-country='cn' 使用阿里镜像
    # --kubernetes-version=v1.23.3 直接start 目前(2022年9月15日)是1.24 ,总是报错
    # --registry-mirror 拉取docker时用的源,官方文档上用的是k8s.gcr.io,这个一般访问不通
    minikube start --image-mirror-country='cn' --driver=docker --kubernetes-version=v1.23.3 --registry-mirror=https://hj3oa7u5.mirror.aliyuncs.com
    
    # 启动 dashboard 时,如果虚拟机是minimal,没有浏览器,就用proxy代理出来,记得关闭firewalld
    minikube dashboard
    http://192.168.56.105:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
    
    kubectl proxy --port=8001 --address='192.168.56.105' --accept-hosts='^.*' &
    
    # 如果还是kicbase下载不了,可以把base-image 设置成anjone/kicbase,这个是dockerhub里面的镜像,可以访问
    minikube start --vm-driver=docker  --base-image="anjone/kicbase"   --registry-mirror=https://f1z25q5p.mirror.aliyuncs.com
    
    # 往集群里 添加节点
    minikube node add
    minikube node delete
    minikube node list
    # 创建时指定 profile(其实就是cluster name),下回就不用带那么多参数了
    minikube start --profile hahah
    // 或者-p
    minikube start -p hahha
    # list profile
    minikube profile list
    
    # 如果你也是虚拟机的话,u may need this
    minikube start --listen-address=0.0.0.0
    
    //至今 没有找到像kind一样,启动时指定config的方法
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    2022年9月18日 修改:
    minikube启动失败原因找到了,排除那些交换分区之类的错误,如果还是启动失败,就加上
    container-runtime=containerd,指定containerd。
    原因(引用官网中文):
    v1.24 之前的 Kubernetes 版本直接集成了 Docker Engine 的一个组件,名为 dockershim。 这种特殊的直接整合不再是 Kubernetes 的一部分 (这次删除被作为 v1.20 发行版本的一部分宣布)。

    你可以阅读检查 Dockershim 移除是否会影响你以了解此删除可能会如何影响你。 要了解如何使用 dockershim 进行迁移, 请参阅从 dockershim 迁移。

    如果你正在运行 v1.25 以外的 Kubernetes 版本,查看对应版本的文档。

    所以所以,如果坚持用docker那么需要安装一个叫做cri-dockerd的家伙,只能说被大佬之间的博弈波及了····
    解决:要么降低k8s的版本,要么指定container-runtime为containerd

    # 降低版本
    minikube start \
    --image-mirror-country='cn' \
    --driver=docker \
    --kubernetes-version=v1.23.3 \
    --registry-mirror=https://hj3oa7u5.mirror.aliyuncs.com
    # 使用containerd 			   
    minikube start \
    --image-mirror-country='cn' \
    --driver=docker \
    --container-runtime=containerd \
    --registry-mirror=https://hj3oa7u5.mirror.aliyuncs.com
    # 按理说 minikube 默认的runtime就是containerd ,但是没有这个参数就是启动不了
    [kube@node01 ~]$ minikube start --help | grep runtime
        --container-runtime='':
            The container runtime to be used. Valid options: docker, cri-o, containerd (default: auto)
            If set, force the container runtime to use systemd as cgroup manager. Defaults to false.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这里记录下Learn Kubernetes Basics 里面的所有命令,以备不时之需。

    官方教程:
    Interactive Tutorial:
    
    -----------------Module 1 - Create a Kubernetes cluster------------
    Step 1 Cluster up and running:
    minikube version
    minikube start
    
    Step 2 Cluster version:
    kubectl version
    
    Step 3 Cluster details:
    kubectl cluster-info
    kubectl get nodes
    
    -----------------Module 2 - Deploy an app------------
    Step 1 kubectl basics:
    kubectl version
    kubectl get nodes
    
    Step 2 Deploy our app:
    kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
    kubectl create deployment kubernetes-bootcamp --image=jocatalin/kubernetes-bootcamp:v1
    kubectl get deployments
    
    Step 3 View our app:
    echo -e "\n\n\n\e[92mStarting Proxy. After starting it will not output a response. Please click the first Terminal Tab\n"; 
    kubectl proxy
    curl http://localhost:8001/version
    export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
    echo Name of the Pod: $POD_NAME
    curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/
    
    -----------------Module 3 - Explore your app------------
    Step 1 Check application configuration
    kubectl get pods
    kubectl describe pods
    
    Step 2 Show the app in the terminal
    echo -e "\n\n\n\e[92mStarting Proxy. After starting it will not output a response. Please click the first Terminal Tab\n"; kubectl proxy
    export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
    echo Name of the Pod: $POD_NAME
    curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
    
    Step 3 View the container logs
    kubectl logs $POD_NAME
    
    Step 4 Executing command on the container
    kubectl exec $POD_NAME -- env
    kubectl exec -ti $POD_NAME -- bash
    curl localhost:8080
    exit
    
    -----------------Module 4 - Expose your app publicly------------
    Step 1 Create a new service
    
    kubectl get services
    kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
    kubectl describe services/kubernetes-bootcamp
    export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
    echo NODE_PORT=$NODE_PORT
    curl $(minikube ip):$NODE_PORT
    
    Step 2: Using labels
    kubectl describe deployment
    kubectl get pods -l app=kubernetes-bootcamp
    kubectl get services -l app=kubernetes-bootcamp
    export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
    echo Name of the Pod: $POD_NAME
    kubectl label pods $POD_NAME version=v1
    kubectl describe pods $POD_NAME
    kubectl get pods -l version=v1
    
    Step 3 Deleting a service
    kubectl delete service -l app=kubernetes-bootcamp
    kubectl get services
    curl $(minikube ip):$NODE_PORT
    kubectl exec -ti $POD_NAME -- curl localhost:8080
    
    ----------------Module 5 - Scale up your app---------------------
    Step 1: Scaling a deployment
    kubectl get deployments
    kubectl get rs
    kubectl scale deployments/kubernetes-bootcamp --replicas=4
    kubectl get deployments
    kubectl get pods -o wide
    kubectl describe deployments/kubernetes-bootcamp
    
    Step 2: Load Balancing
    kubectl describe services/kubernetes-bootcamp
    export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
    echo NODE_PORT=$NODE_PORT
    curl $(minikube ip):$NODE_PORT
    
    Step 3: Scale Down
    kubectl scale deployments/kubernetes-bootcamp --replicas=2
    kubectl get deployments
    kubectl get pods -o wide
    
    ----------------Module 6 - Update your app---------------------
    
    Step 1: Update the version of the app  	
    kubectl get deployments 	
    kubectl get pods
    kubectl describe pods
    kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
    kubectl get pods
    
    Step 2: Verify an update
    kubectl describe services/kubernetes-bootcamp
    export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
    echo NODE_PORT=$NODE_PORT
    curl $(minikube ip):$NODE_PORT
    kubectl rollout status deployments/kubernetes-bootcamp
    kubectl describe pods
    
    Step 3: Rollback an update
    kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
    kubectl get deployments
    kubectl get pods
    kubectl describe pods
    kubectl rollout undo deployments/kubernetes-bootcamp
    kubectl get pods
    kubectl describe pods
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124

    最后,在学习kubernetes的过程中,伟大的G+F+W给我带来了强大的助(zu)力,本人表示万分感谢,此致,敬礼!!!
    hi !ho !

    参考文章:
    https://kubernetes.io/docs/tutorials/kubernetes-basics/
    https://gitee.com/moxi159753/LearningNotes/tree/master/K8S/1_Kubernetes%E7%AE%80%E4%BB%8B
    https://blog.51cto.com/loong576/2405624
    https://blog.csdn.net/a765717/article/details/120193786

  • 相关阅读:
    【经验分享】如何构建openGauss开发编译提交一体化环境
    【STM32】LED闪烁&LED流水灯&蜂鸣器(江科大)
    Element UI 日期组件自定义可选范围
    【JS重点15】原型对象概述
    【获取当前月时间】elementul日期选择器在页面一进来直接获取到本月1号到当前日期的方法【详细注释】
    【送书活动】强势挑战Java,Kotlin杀回TIOBE榜单Top 20!学Kotlin看哪些书?
    操作Excel
    413报错(nginx :请求体大小超出最大限制)
    ubuntu 20.04 docker安装emqx 最新版本或指定版本
    嵌入式基础
  • 原文地址:https://blog.csdn.net/NOOBBB/article/details/126867248