(精华)2020年10月4日 微服务 k8s-集群搭建

    科技2022-07-20  111

    k8s-集群搭建

    k8s介绍

    什么是k8s

    k8s是一个舵手,专门用来进行给docker掌管方向的,换句话说,就是用来控制docker运行容器的

    和docker 是一样的功能。所以就有一个概念cluster

    为什么要使用k8s

    因为当docker容器异常的时候,docker无法将容器进行重启,如果容器数量比较大

    swarm 优点

    1、架构简单,部署运维成本低

    ​ docker swarm 集群模式由于原生态集成到docker-engine中,所以首先学习成本低,对于使用docker-engine 1.12版本及以上可以平滑过渡,service服务可以满足动态增减容器个数,同时具备自身的负载均衡,swarm管理者多台设定保证了机器在出错后有一个良好的容灾机制

    2、启动速度快

    ​ swarm集群只会有两层交互,容器启动是毫秒级

    swarm缺点

    1 无法提供更精细的管理

    swarm API兼容docker API,所以使得swarm无法提供集群的更加精细的管理

    2 网络问题

    在网络方面,默认docker容器是通过桥接与NAT和主机外网络通信,这样就出现2个问题,一个是因为是NAT,外部主机无法主动访问到容器内(除了端口映射),另外默认桥接IP是一样的,这样会出现不同主机的容器有相同的IP的情况。这样两容器更加不能通信。同时网络性能方面,有人测试经过桥接的网络性能只有主机网络性能的70%。当然以上问题可以通过其他工具解决,比如用 Flannel 或者 OVS网桥

    3 容器可靠性

    在容器可靠性方面,相较于Kubernetes的Replication Controllers可以监控并维持容器的生命,swarm在启动时刻可以控制容器启动,在启动后,如果容器或者容器主机崩溃,swarm没有机制来保证容器的运行。

    kubernetes优点:

    1 管理更趋于完善稳定

    kubernetes 集群管理更趋于完善稳定,同时pod功能上比swarm的service更加强大

    2 健康机制完善

    Replication Controllers可以监控并维持容器的生命

    3 轻松应对复杂的网络环境

    kubernetes默认使用Flannel作为overlay网络。

    Flannel是CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(OverlayNetwork)工具,其目的在于帮助每一个使用 Kuberentes 的CoreOS 主机拥有一个完整的子网。

    kubernetes劣势:

    1 配置、搭建稍显复杂,学习成本高

    由于配置复杂,学习成本相对较高,对应运维的成本相对高点

    2 启动速度稍逊

    kubernetes会有五层交互,启动是秒级,启动速度慢于swarm

    官网地址

    https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/

    k8s集群概念

    swarm和k8s概念对比

    node cluster 公司(提供工作场合)

    manager master 老板(分配任务,负载均衡)

    worker node 员工(负载干活)

    k8s集群内部概念

    swarm 内部和k8s内部对比

    service pod 项目经理

    stack Deployment 项目总监

    k8s集群操作概念

    kubeadm :k8s集群管理组件

    kubectl: 操作k8s集群客户端

    kubelet:运行每个节点容器

    k8s集群搭建

    注意

    k8s有硬件要求,必须运行cpu为2核,内存为2G以上

    前提条件

    docker:k8s运行用来运行容器

    kubeadm :k8s集群搭建

    kubectl: 操作k8s集群客户端

    kubelet:运行每个节点容器

    步骤

    1-8 (除了4) 在所有节点执行

    1.关闭防火墙,配置免密登录,这点基本所有教程都有

    systemctl stop firewalld #防止端口不开发,k8s集群无法启动

    2.关闭selinux

    setenforce 0

    3.关闭swap

    swapoff -a 临时关闭 free 可以通过这个命令查看swap是否关闭了 vim /etc/fstab 永久关闭 注释swap那一行(访问内存分区,k8s无法启动)

    4.添加主机名与IP对应的关系,免密(这一步可以只在master执行),这一步我为后面传输网络做准备

    vim /etc/hosts 192.168.235.145 k8s-master 192.168.235.146 k8s-node1 ssh-keygen cat .ssh/id_rsa.pub >> .ssh/authorized_keys chmod 600 .ssh/authorized_keys # 可以在master生成,然后拷贝到node节点 scp -r .ssh root@192.168.44.5:/root

    5.将桥接的IPV4流量传递到iptables 的链

    vi /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1

    6.安装Docker及同步时间

    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo yum -y install docker-ce systemctl start docker systemctl enable docker # 同步时间(这一步必须做,否则后面安装flannel可能会有证书错误) yum install ntpdate -y ntpdate cn.pool.ntp.org

    7.添加阿里云YUM软件源

    vi /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=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

    8.安装kubeadm,kubelet和kubectl

    yum makecache fast yum install -y kubectl-1.18.0 kubeadm-1.18.0 kubelet-1.18.0 --nogpgcheck

    9. 部署Kubernetes Master

    初始化master(在master执行)

    # 第一次初始化比较慢,需要拉取镜像 kubeadm init --apiserver-advertise-address=192.168.235.145 # 换成自己master的IP --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16 # 使用flannel网络必须设置成这个cidr 接下来,将初始化结果中的命令复制出来执行: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

    验证状态,发现前两个是pending,get pods 发现是not ready

    kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-9d85f5447-fhdmx 0/1 Pending 0 100d kube-system coredns-9d85f5447-x5wfq 0/1 Pending 0 100d kube-system etcd-local1 1/1 Running 0 100d kube-system kube-apiserver-local1 1/1 Running 0 100d kube-system kube-controller-manager-local1 1/1 Running 0 100d kube-system kube-proxy-2trv9 1/1 Running 0 100d kube-system kube-scheduler-local1 1/1 Running 0 100d

    需要安装flannel

    # 安装flannel(在master执行) kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 安装完flannel,将配置拷到node节点,否则添加节点之后状态不对 scp -r /etc/cni root@192.168.44.5:/etc # 这一步也要拷贝,否则节点看着正常,但是pod由于网络原因无法创建 scp -r /run/flannel/ root@192.168.44.5:/run

    再次初始化

    # 执行第9步的命令 kubeadm init ... 参数 --kubernetes-version 指定Kubernetes版本 --apiserver-advertise-address 指定apiserver的监听地址 --pod-network-cidr 10.244.0.0/16 指定使用flanneld网络 --apiserver-bind-port api-server 6443的端口 --ignore-preflight-errors all 跳过之前已安装部分(出问题时,问题解决后加上继续运行)

    查看集群状态,master正常

    [root@local1 ~]# kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"} [root@local1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION local1 Ready master 2m16s v1.17.3 [root@local1 ~]# kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-9d85f5447-9s4mc 1/1 Running 0 16m kube-system coredns-9d85f5447-gt2nf 1/1 Running 0 16m kube-system etcd-local1 1/1 Running 0 16m kube-system kube-apiserver-local1 1/1 Running 0 16m kube-system kube-controller-manager-local1 1/1 Running 0 16m kube-system kube-proxy-sdbl9 1/1 Running 0 15m kube-system kube-proxy-v4vxg 1/1 Running 0 16m kube-system kube-scheduler-local1 1/1 Running 0

    **10、**node工作节点加载

    node节点执行1-8,如果第五步不执行,会添加失败

    在node节点执行上面初始化时生成的join命令

    kubeadm join 192.168.235.145:6443 --token w5rify.gulw6l1yb63zsqsa --discovery-token-ca-cert-hash sha256:4e7f3a03392a7f9277d9f0ea2210f77d6e67ce0367e824ed891f6fefc7dae3c8 # 输出 This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

    在master查看

    [root@local1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION local1 Ready master 4m58s v1.18.3 local2 Ready <none> 3m36s v1.18.3

    在node节点查看

    [root@local3 ~]# kubectl get nodes Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes") # 如果报错,需要将master的admin.conf拷贝过来 # master执行 scp /etc/kubernetes/admin.conf root@local3:/etc/kubernetes/ # 然后在node执行下面三步 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 再次在node查看 [root@local3 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION local1 Ready master 6m36s v1.18.0 local2 Ready <none> 31s v1.18.0 local3 Ready <none> 5m43s v1.18.0

    11、如果节点出错,可以移除节点

    #重置节点 kubeadm reset #删除节点,删除后 数据就从etcd中清除了(可运行kubectl的任一节点中执行) kubectl delete node node-1

    12、如果加入节点时,token过期,可以重新生成

    查看token kubeadm token list 默认生成的token有效期是一天,生成永不过期的token [root@k8s-master ~]# kubeadm token create --ttl 0 W0501 09:14:13.887115 38074 validation.go:28] Cannot validate kube-proxy config - no validator is available W0501 09:14:13.887344 38074 validation.go:28] Cannot validate kubelet config - no validator is available 创建token [root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' # token 4dc852fb46813f5b1840f06578ba01283c1a12748419ba8f25ce2788419ab1c2 在worker节点执行join kubeadm join 192.168.0.104:6443 --token vahjcu.rhm7864v6l400188 --discovery-token-ca-cert-hash sha256:4dc852fb46813f5b1840f06578ba01283c1a12748419ba8f25ce2788419ab1c2

    k8s运行

    基础命令

    获取节点

    kubectl get node

    获取相信节点

    kubectl get node -o wide

    运行nginx pod(这个时候只是容器在pod内部使用,还不能给外界进行访问)

    kubectl run nginx --image=nginx --port=80

    查看nginx pod信息(显示demo是否成功或者失败信息)

    kubectl describe pod nginx-pod

    暴露nginx pod(暴露给外界进行访问)

    kubectl expose pod nginx-pod --port=80 --target-port=80 --type=NodePort

    查看暴露nginx副本deployment service

    kubectl get service -o wide

    副本命令(伸缩命令)

    创建副本集deployment

    kubectl create 命令

    创建nginx副本deployment

    kubectl create deployment nginx-deployment --image=nginx

    查看nginx副本deployment

    kubectl create deployment -o wide

    暴露nginx副本deployment

    kubectl expose deployment nginx-deployment --port=80 --target-port=8000 --type=NodePort

    查看暴露nginx副本deployment service

    kubectl get service -o wide

    动态扩容nginx副本deployment

    kubectl scale --replicas=3 deployment/nginx

    yaml文件命令

    nginx副本集部署deployment

    apiVersion: apps/v1 #k8s版本号 kind: Deployment #部署类型(资源类型) metadata: #元数据(用于定义资源信息) name: nginx-deployment-tony5 #资源名称 labels: #资源标签(版本号) app: nginx spec: #资源相关信息规范 replicas: 3 #副本数 selector: #选择哪一个版本 matchLabels: app: nginx template: #模板 metadata: #资源的元数据/属性 labels: #设置资源的标签 app: nginx spec: #资源规范字段(规范容器配置) containers: #指定容器 - name: nginx #容器名称 image: nginx #容器使用的镜像 ports: #端口号 - containerPort: 80 #容器对应的端口号

    nginx暴露service

    apiVersion: v1 # 指定api版本,此值必须在kubectl api-versions中 kind: Service # 指定创建资源的角色/类型 metadata: # 资源的元数据/属性 name: service-tony # 资源的名字,在同一个namespace中必须唯一 namespace: default # 部署在哪个namespace中 labels: # 设定资源的标签 app: demo spec: # 资源规范字段 type: NodePort # ClusterIP 类型 ports: - port: 8080 # service 端口 targetPort: 80 # 容器暴露的端口 protocol: TCP # 协议 name: http # 端口名称 selector: # 选择器(选择什么资源进行发布给外界进行访问:pod deployment 等等资源) app: nginx

    k8s部署项目

    备注:

    mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config

    kubeadm join 192.168.44.3:6443 --token ctc73p.8x7jxvsnv8qvo8kz ​ --discovery-token-ca-cert-hash sha256:b1af5f09a5f4820b73d6640da44d9905e1683c326ede2b672964d08732ad7dd5

    kubeadm init --kubernetes-version v1.18.0 --apiserver-advertise-address=123.57.164.54 --pod-network-cidr 10.244.0.0/16 --apiserver-bind-port api-server 6443 --ignore-preflight-errors all

    kubeadm init --apiserver-advertise-address=192.168.44.3 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16

    kubeadm init --apiserver-advertise-address=123.57.164.54 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16

    kubeadm init \ --apiserver-advertise-address=123.57.164.54 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.18.0 \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16
    Processed: 0.009, SQL: 8