• 微服务架构


    一般在公司部署或者真实环境部署k8s平台,很有可能是内网环境,也即意味着是无法连接互联网的环境,这时就需要离线部署k8s平台。在此整理离线部署k8s的步骤,分享给大家,有什么不足之处,欢迎指正。

    1、准备环境

    这次离线部署k8s的版本为v1.10.1,同时docker的版本为17.12.0-ce,不过本文章不介绍如何离线部署docker,如果大家要看的话,可以看本人之前写的文章CentOS7离线部署docker

    本人准备的环境是3台虚拟机,也即1台master节点,2个node节点,ip及配置如下:

    主机名 IP 内存
    k8s-master 192.168.197.131 2G
    k8s-node-1 192.168.197.132 1G
    k8s-node-2 192.168.197.133 1G

    2、设置环境

    (1)、所有节点关闭防火墙,操作命令如下:

    systemctl stop firewalld
    systemctl disable firewalld
    

    (2)、所有节点关闭selinux,操作命令如下:

    setenforce 0
    

    同时编辑/etc/selinux/config,使其中SELINUX=disabled

    (3)、所有节点关闭swap,操作命令如下:

    swapoff -a
    

    同时编辑/etc/fstab,注释掉含有swap的这一行

    (4)、所有节点设置系统参数,操作如下命令:

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

    3、安装kubeadm、kubelet、kubectl

    相关的rpm安装包,已经提前下载好了,需要如下文件:

    在每个节点都安装这些rpm安装包,安装命令如下:

    rpm -ivh *.rpm
    

    设置Cgroup Driver,由于kubelet的Cgroup Driver为systemd,而docker的Cgroup Driver信息可以通过:

    docker info
    

    返回的信息为:

    可以发现docker的Cgroup Driver为cgroupfs,为此将kubelet的Cgroup Driver修改为cgroupfs,即修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf,将其中的cgroup-driver=systemd改为cgroupfs

    注意:所有节点kubelet的Cgroup Driver都要修改为cgroupfs

    所有节点重设kubelet服务,并重启kubelet服务,同时设置为开机自启动,即:

    systemctl daemon-reload && systemctl restart kubelet
    systemctl enable kubelet
    

    4、准备镜像

    相关要用到的镜像,已经提前下载好了(文章最后会提供下载所有安装文件的地址),只需要用docker load命令将镜像导入即可,注意所有的节点都需要导入这些镜像, 镜像列表如下:

    5、部署master节点

    通过kubeadm初始化master节点,在master节点上执行:

    kubeadm init --kubernetes-version=v1.10.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.197.131
    

    由于在此网络配置采用flannel,所以--pod-network-cidr设置为10.244.0.0/16

    该命令执行完后,如果看到如下结果,则表示初始化成功,即:

    Your Kubernetes master has initialized successfully!
    
    To start using your cluster, you need to run the following as a regular user:
    
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
    You can now join any number of machines by running the following on each node
    as root:
    
      kubeadm join 192.168.197.131:6443 --token io9qub.vnikk4mxx2vr3g05 --discovery-token-ca-cert-hash sha256:9353632362d10d676b6ad69cd7675bf2facd71e265ffcf1b69a9bcd4d0e2dd3e
    

    则需要按照提示,执行如下命令:

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

    同时将其它node节点加入k8s集群命令记好,等下后面需要用到的。

    紧接着在master节点部署网络插件flannel,这时可以通过kubectl命令来安装,即:

    kubectl apply -f kube-flannel.yml
    

    注意:kube-flannel.yml文件,可以在https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml获取到,当然文章最后提供的安装包里面也有该文件的。

    此时可以查看master的状态,即输入如下命令:

    kubectl get nodes
    

    结果为:

    可见看到master的状态为Ready,即表明master节点部署成功!

    6、加入node节点

    加入node节点的操作就很简单了,只需要将上面初始化master节点成功后返回的join命令,在所有node节点上执行即可,即:

    kubeadm join 192.168.197.131:6443 --token io9qub.vnikk4mxx2vr3g05 --discovery-token-ca-cert-hash sha256:9353632362d10d676b6ad69cd7675bf2facd71e265ffcf1b69a9bcd4d0e2dd3e
    

    如果这个join命令忘记保存,可以在master节点执行如下命令获取join命令的:

    kubeadm token create --print-join-command
    

    所有的node节点都加入后,可以在master节点执行命令查看各个节点的状态,即:

    kubectl get nodes
    

    结果为:

    由上可知所有节点的状态都Ready,说明部署成功了!

    也可查看一下所有pod的状态,即执行:

    kubectl get pods --all-namespaces
    

    结果为:

    7、自定义证书并部署dashboard

    在master节点的/root/k8s/ssl目录下制作证书:

    (1)、生成私钥:

    openssl genrsa -out ca.key 2048
    

    (2)、生成自签名证书:

    openssl req -new -x509 -key ca.key -out ca.crt -days 3650 -subj "/C=CN/ST=HB/L=WH/O=DM/OU=YPT/CN=CA"
    

    (3)、生成dashboard私钥:

    openssl genrsa -out dashboard.key 2048
    

    (4)、申请签名请求:

    openssl req -new -sha256 -key dashboard.key -out dashboard.csr -subj "/C=CN/ST=HB/L=WH/O=DM/OU=YPT/CN=192.168.197.131"
    

    (5)、创建配置文件dashboard.cnf ,内容如下:

    extensions = san
    [san]
    keyUsage = digitalSignature
    extendedKeyUsage = clientAuth,serverAuth
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    subjectAltName = IP:192.168.197.131,IP:127.0.0.1,DNS:192.168.197.131,DNS:localhost,DNS:k8s-master
    

    (6)、签发证书:

    openssl x509 -req -sha256 -days 3650 -in dashboard.csr -out dashboard.crt -CA ca.crt -CAkey ca.key -CAcreateserial -extfile dashboard.cnf
    

    (7)、将证书信息放到secret中:

    kubectl create secret generic kubernetes-dashboard-certs --from-file="dashboard.crt,dashboard.key" -n kube-system 
    

    (8)、安装kubernetes-dashboard.yml,即执行:

    kubectl apply -f kubernetes-dashboard.yml
    

    其中kubernetes-dashboard.yml文件文章最后的安装包里面会提供。

    (9)、设置dashboard的admin权利:

    由于kubernetes-dashboard绑定的角色为kubernetes-dashboard-minimal,为了提供admin权限则需要执行:

    kubectl apply -f kubernetes-dashboard-rbac-admin.yml
    

    其中 kubernetes-dashboard-rbac-admin.yml文件文章最后的安装包里面会提供。

    (10)、查看pod、svc状态

    输入kubectl get pods --all-namespaces,可以看到有这么一条信息:

    kube-system   kubernetes-dashboard-7d5dcdb6d9-nszwk   1/1       Running   1
    

    输入kubectl get svc -n kube-system,可以看到有这么一条信息:

    kubernetes-dashboard   NodePort    10.107.115.153   <none>        443:31195/TCP
    

    此根据NodePort模式下,对外访问dashboard的端口为31195,即:在浏览器中输入:

    https://192.168.197.131:31195
    

    注意是https协议。

    可看到如下页面:

    可以通过令牌的访问方式进入,即首先得获取令牌信息:

    (1)、首先得到kubernetes-dashboard-admin的secret记录,即:

    kubectl get secret --all-namespaces | grep kubernetes-dashboard-admin
    

    得到的结果为:

    kube-system   kubernetes-dashboard-admin-token-75pdg           kubernetes.io/service-account-token   3
    

    (2)、获取token值,即通过上面secret结果,然后执行如:

    kubectl describe secret kubernetes-dashboard-admin-token-75pdg -n kube-system
    

    得到的结果为:

    这个token值输入到浏览器中令牌所需要的内容即可以登录,即:

    8、部署自定义测试实例

    本人通过SpringBoot写了一个简单的工程,只有一个测试方法,即:

    package com.swnote.k8s.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * 测试类
     * 
     * @author lzj
     * @date [2019-03-16]
     */
    @RestController
    public class TestController {
    
        @RequestMapping(value = "/", method = RequestMethod.GET)
        public String index() {
            return "架构与我,欢迎关注!";
        }
    }
    

    然后将本工程打成jar包,然后通过Dockerfile文件打成镜像,Dockerfile文件如下:

    FROM java:8
    VOLUME /tmp
    ADD k8s-jgyw-1.0.jar app.jar
    #RUN bash -c 'touch /app.jar'
    EXPOSE 80
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
    

    执行打镜像的命令:

    docker build -t k8s-jgyw:1.0 .
    

    注意所有的节点都需要k8s-jgyw:1.0镜像,然后部署该实例k8s-jgyw.yml如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: jgyw
      labels:
        app: k8s-jgyw
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: k8s-jgyw
      template:
        metadata:
          labels:
            app: k8s-jgyw
        spec:
          containers:
            - name: jgyw
              image: k8s-jgyw:1.0
              ports:
                - containerPort: 80
                  protocol: TCP
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: jgyw
      labels:
        app: k8s-jgyw
    spec:
      type: NodePort
      selector:
        app: k8s-jgyw
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    

    执行部署命令:

    kubectl apply -f k8s-jgyw.yml
    

    然后svc信息,获取对外访问的端口,即:

    kubectl get svc
    

    返回结果为:

    jgyw         NodePort    10.97.250.52   <none>        80:32461/TCP
    

    则通过浏览器访问如下地址:

    http://192.168.197.131:32461
    

    结果如下:

    说明测试实例部署成功了!

    9、安装包下载地址

    安装包的下载为https://pan.baidu.com/s/1r0OkljXdmXx37h9aHDLDDg,提取码为:m11n

    关注我

    以你最方便的方式关注我:
    微信公众号:

  • 相关阅读:
    REGIONAL SCRUM GATHERING(RSG)2019 CHINA.
    《敏捷革命》读书笔记
    敏捷之旅2017年北京站活动圆满结束
    团队合作的Ground Rules
    开发团队(Team)的主要职责和特征
    敏捷之旅2017年北京站的活动主题和讲师话题征集中
    产品负责人(Product Owner)的主要职责和技能
    战地记者也在使用Scrum
    Scrum由来
    他们是今年最可爱的人——敏捷之旅2017年北京活动志愿者
  • 原文地址:https://www.cnblogs.com/atcloud/p/10614326.html
Copyright © 2020-2023  润新知