k8s的安装及应用

  1. 安装docker

    之前编写的博客有docker的安装教程

    Kubernetes整体架构

    Master

    k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;

    Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 所组成;

    Nodes

    集群工作节点,运行用户业务应用容器;

    Nodes节点也叫Worker Node,包含kubelet、kube proxy 和 Pod(Container Runtime);

    安装k8s

    • 部署方式

    选择使用kubeadm

    Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;

    官方地址

    • Kubernetes部署环境准备

    关闭防火墙

    systemctl stop firewalld
    systemctl disable firewalld
    

    关闭selinux

    sed -i 's/enforcing/disabled/' /etc/selinux/config  #永久关闭
    setenforce 0  #临时关闭
    

    关闭swap(k8s禁止虚拟内存以提高性能)

    sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
    swapoff -a #临时
    

    在master和node添加hosts

    cat >> /etc/hosts << EOF
    
    192.168.172.134 k8smaster
    
    192.168.172.135 k8snode
    
    EOF
    

    设置网桥参数(都需设置)

    cat > /etc/sysctl.d/k8s.conf << EOF
    
    net.bridge.bridge-nf-call-ip6tables = 1
    
    net.bridge.bridge-nf-call-iptables = 1
    
    EOF
    

    配置生效

    sysctl --system  #生效
    
    • 部署k8s

    启动docker

    systemctl start docker
    

    添加k8s的阿里云YUM源

    cat > /etc/yum.repos.d/kubernetes.repo << EOF
    [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
    

    安装 kubeadm,kubelet 和 kubectl

    yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y
    systemctl enable kubelet.service
    

    启动k8s

    • 部署Kubernetes Master主节点(在master上执行)
    kubeadm init --apiserver-advertise-address=192.168.9.134 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
    
    • 接下来在master机器上执行
    mkdir -p $HOME/.kube
    
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    • 接下来把node节点加入Kubernetes master中,在Node机器上执行;

    向集群添加新节点,执行的命令就是kubeadm init最后输出的kubeadm join命令(在要添加的节点机器中执行)

    kubeadm join 192.168.9.134:6443 --token wp7kpe.m4oltmw9aycudehz \
        --discovery-token-ca-cert-hash sha256:be41c36ee26afaa877c77a2ddd1f629830542714b33a3458f5a338a9070e193a
    

    • 部署网络插件

    应用kube-flannel.yml文件得到运行时容器

    kubectl apply -f kube-flannel.yml #在master机器上执行
    
    • 安装成功

    尝试部署个nginx

    kubectl create deployment nginx --image=nginx
    
    kubectl expose deployment nginx --port=80 --type=NodePort
    

    查看pods

    查看services

    图中标记的端口才是对应浏览器访问的端口

    k8s命令

    整体流程:Mater控制Node --> namespace --> service --> deployment(控制器) --> pod--> docker

    #查看一下,相关命令:
    kubectl get node(s)
    kubectl get namespace
    #以下命令可以通过-n <namespace>指定查询对应的namespace,不写默认查询default这个命名空间
    kubectl get service(s)
    kubectl get deployment (deploy)
    kubectl get pod(s)
    #删除service
    kubectl delete service nginx
    #删除nginx的控制器
    kubectl delete deployment nginx
    #删除pod
    kubectl delete pod nginx-6799fc88d8-zc48m(pod名字)
    #kubectl命令帮助
    kubectl --help
    

    k8s使用示例

    • 部署Kubernetes Dashbaord(k8s的web ui)

    Kubernetes仪表盘是Kubernetes集群的基于Web的通用UI,它允许用户管理群集中运行的应用程序并对其进行故障排除,以及管理群集本身

    1. 下载yaml的资源清单
    #需FQ才可下载
    wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
    
    1. 修改下载的yaml文件

    1. 通过配置文件启动
    kubectl apply -f recommended.yaml
    
    1. 通过刚刚修改的配置文件端口浏览器访问

    1. 生成对应管理员的token
    #未创建这个用户才需执行 这个命令(第一次才需执行)
    kubectl create serviceaccount dashboard-admin -n kube-system
    #未绑定权限用户才需执行 这个命令(第一次才需执行)
    kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
    #查看token通过此命令 然后复制对应token进行登录
    kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
    
    1. 登录后的页面

    • 部署一个springboot项目
    1. 制作Dockerfile文件,生成镜像

    此步骤需要在node节点操作,因为master节点是不参与容器的部署的,所以生成的镜像需要在node节点中

    创建jdk.dockerfile文件

    FROM centos:latest
    MAINTAINER yzy
    ADD jdk-8u251-linux-x64.tar.gz /usr/local/java
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_251
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV PATH $PATH:$JAVA_HOME/bin
    CMD java -version
    

    构建镜像:docker build -t -f jkd.dockerfile jdk1.8.0_251 .

    创建springboot-k8s-1.0.0-jar.dockerfile文件

    FROM jdk1.8.0_251
    MAINTAINER cat
    ADD springboot-k8s-1.0.0-jar /opt
    RUN chmod +x /opt/38-springboot-k8s-1.0.0.jar
    CMD java -jar /opt/38-springboot-k8s-1.0.0.jar
    

    构建镜像:docker build -t springboot-k8s-1.0.0-jar -f springboot-k8s-1.0.0-jar.dockerfile .

    1. 使用k8s命令生成对应的配置文件,以后通过这个配置文件进行部署容器(master节点执行)
    kubectl create deployment springboot-k8s --image=springboot-k8s-1.0.0-jar --dry-run -o yaml > deploy.yaml
    
    1. 修改生成的配置文件

    因为是从本地拉取镜像,所以需要修改一下配置

    1. 通过命令部署容器kubectl apply -f deploy.yaml

使用Ingress暴露应用

  • NodePort

    NodePort服务是让外部请求直接访问服务的最原始方式,NodePort是在所有的节点(虚拟机)上开放指定的端口,所有发送到这个端口的请求都会直接转发到服务中的pod里;

    三种端口说明

    ports:  
     - name: http
       port: 80
       targetPort: 80
       nodePort: 30008
       protocol: TCP
    

    nodePort

    外部机器(在windows浏览器)可以访问的端口;

    比如一个Web应用需要被其他用户访问,那么需要配置type=NodePort,而且配置nodePort=30001,那么其他机器就可以通过浏览器访问scheme://node:30001访问到该服务;

    targetPort

    容器的端口,与制作容器时暴露的端口一致(Dockerfile中EXPOSE),例如docker.io官方的nginx暴露的是80端口;

    port

    Kubernetes集群中的各个服务之间访问的端口,虽然mysql容器暴露了3306端口,但外部机器不能访问到mysql服务,因为他没有配置NodePort类型,该3306端口是集群内其他容器需要通过3306端口访问该服务;

    这种方式的不足:

    1、一个端口只能供一个服务使用;

    2、只能使用30000–32767之间的端口;

    3、如果节点/虚拟机的IP地址发生变化,需要人工进行处理;

  • ingress

Ingress 英文翻译为:入口、进入、进入权、进食,也就是入口,即外部请求进入k8s集群必经之口

虽然k8s集群内部署的pod、service都有自己的IP,但是却无法提供外网访问,以前我们可以通过监听NodePort的方式暴露服务,但是这种方式并不灵活,生产环境也不建议使用;

Ingresss是k8s集群中的一个API资源对象,相当于一个集群网关,我们可以自定义路由规则来转发、管理、暴露服务(一组pod),比较灵活,生产环境建议使用这种方式;

使用Ingress Nginx的步骤:

1、部署Ingress Nginx

​ 下载对应的ingress-deploy.yml

​ 该配置文件相比官网,修改了镜像的地址,改为阿里云

​ 使用命令部署kubectl apply -f ingress-deploy.yml

2、配置Ingress Nginx规则;

​ 编写ingress-nginx-rule.yml文件

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-ingress
spec:
  rules:
  - host: shouyaya.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
        #这里选择k8s里已部署的容器
          service:
            name: nginx
            port: 
              number: 80

​ 使用命令配置规则kubectl apply -f ingress-nginx-rule.yml

​ 若出现以下错误:

解决:kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission

​ 然后再次执行:kubectl apply -f ingress-nginx-rule.yaml

​ 最后检查一下规则是否生效:kubectl get ingress

​ 最后在本地配置下hosts文件,测试访问下

posted @ 2021-08-14 16:23  shouyaya  阅读(543)  评论(0)    收藏  举报