文章目录
  1. 1. k8s学习(一)
    1. 1.1. 安装
    2. 1.2. 1. 使用kubeadm安装kubectl
      1. 1.2.1. 设置墙内镜像地址
      2. 1.2.2. 安装docker-ce kubelet kubeadm kubectl
    3. 1.3. 2. MiniKube 安装
      1. 1.3.1. 启动minikube的时候,老是遇到端口被占用
    4. 1.4. mac环境
      1. 1.4.0.0.1. 安装后遇到的问题
    5. 1.4.0.1. 安装dashboard
  • 1.5. 在本地创建多节点kubenet
    1. 1.5.1. 部署应用
  • 1.6. 创建Node.js应用程序
  • 1.7. 创建Docker容器镜像
  • 1.8. 创建Service
    1. 1.8.1. ingressCntroller+ ingress+web
    2. 1.8.2. 开启minikube的ingressController插件
      1. 1.8.2.1. 验证ingressController是否开启成功
    3. 1.8.3. 配置ingress rule
    4. 1.8.4. 注意事项
    5. 1.8.5. docker desk for mac 安装ingressController
    6. 1.8.6. 更新镜像与服务
  • 1.9. 更新应用程序
  • 1.10. 清理删除
  • k8s学习(一)

    安装

    升级docker for desktop的mac版本到

    https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

    ** unbuntu环境安装

    1. 使用kubeadm安装kubectl

    vim /etc/docker/daemon.json
    

    export PS1=”[\033[33m]\u[\033[0m]@[\033[36m]k8s[\033[0m]:[\033[32m]\W [\033[0m]$ “

    apt -y install apt-transport-https ca-certificates curl software-properties-common
    
    curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
    
    curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
    

    设置墙内镜像地址

    cat <<EOF >/etc/apt/sources.list.d/docker-k8s.list
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable
    EOF
    
    cat <<EOF >/etc/apt/sources.list.d/docker-k8s.list
    deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
    EOF
    

    安装docker-ce kubelet kubeadm kubectl

    apt update && apt install -y docker-ce kubelet kubeadm kubectl
    systemctl enable kubelet && systemctl start kubelet

    ** 禁用swapp

    sudo swapoff -a
    

    ** 要永久禁掉swap分区,打开如下文件注释掉swap那一行

    sudo vi /etc/fstab
    

    摘取镜像

    kubeadm config images list
    

    初始化

     kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU
    

    设置master主机名

    sudo hostnamectl set-hostname kubemaster
    
    systemctl kubelet status
    systemctl start kubelet
    systemctl kubelet status
    systemctl enable kubelet && systemctl start kubelet
    

    这个方式如果是个人测试与学习用,安装比较复杂,并且浪费时间,建议使用minikube

    • minikube
    1. 需要安装kubectl

    最新的minikue不需要再安装kebectl环境了,因为经常由于版本不匹配问题,导致minikube安装不成功,奶奶的

    2. MiniKube 安装

    MiniKube 是使用 Go 语言开发的,所以安装其实很方便,一是通过下载基于不同平台早已编译好的二级制文件安装,二是可以编译源文件安装。

    curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.12.1/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
    
    1. 启动minikube
      minikube start –vm-driver=none –registry-mirror=https://registry.docker-cn.com

    minikube status

    遇到的问题:

    # sudo systemctl enable kubelet
    Failed to enable unit: Unit file /etc/systemd/system/kubelet.service is masked.
    

    出现这种情况,执行:

    kubelet --version
    

    有反应,说明kubelet安装成功,只是环境变量有问题。

    解决办法:

    # sudo rm /etc/systemd/system/kubelet.service	
    
    root@kubenode:/etc/systemd/system# rm -rf kubelet.service.d/10-kubeadm.conf	
    

    重新加载系统配置:

    sudo systemctl daemon-reload	
    

    查看状态:

    sudo systemctl status kubelet
    

    启动成功:

    root@kubenode:/etc/systemd/system# sudo systemctl status kubelet
    ● kubelet.service - kubelet: The Kubernetes Node Agent
       Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
       Active: inactive (dead)
         Docs: http://kubernetes.io/docs/
    root@kubenode:/etc/systemd/system# sudo systemctl start kubelet
    root@kubenode:/etc/systemd/system# sudo systemctl status kubelet
    ● kubelet.service - kubelet: The Kubernetes Node Agent
       Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
       Active: active (running) since Mon 2020-07-27 18:43:06 CST; 6s ago
         Docs: http://kubernetes.io/docs/
     Main PID: 23171 (kubelet)	
    

    全局启动:

    sudo systemctl enable kubelet
    
    sudo systemctl is-enabled kubelet
    

    查看是否启动,返回:

    enabled
    

    启动minikube的时候,老是遇到端口被占用

    image-20200728094925556

    原因是:localkube,kubectl, kubelet在外面启动了,应该不要启动

    关闭

      systemctl list-unit-files --state=enabled | grep kube | awk '{ print $1 }' | xargs systemctl disable
    
    apt update -y && apt upgrade -y && reboot
    

    sudo systemctl stop localkube

    sudo systemctl stop kubelet

    再执行:

    systemctl enable kubelet.service
    
    systemctl enable localkube.service
    

    image-20200728095523717

    启动minkiube:

    minikube start --vm-driver=none

    image-20200728094442332

    查看状态:

    image-20200728094649289

    看看之前禁用掉的两个服务:

    systemctl list-unit-files --state=enabled | grep kube | awk '{ print $1 }'
    

    mac环境

    • docker desk

    docker-for-desktop

    版本:2.3.0.4(46911)

    docker engine: 19.03.12

    compose: 1.26.2

    k8s: v1.16.5

    image-20200805211832103

    安装后遇到的问题

    开启k8s后,docker desk 界面一直在转:

    https://juejin.im/post/5d87980f5188253f74438bb6

    安装dashboard

     kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
    

    因文件中镜像在国内无法下载,使用如下镜像代替:

    docker pull gcrxio/kubernetes-dashboard-amd64:v1.10.1

    下载完后改成文件中的名字(k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1):

    docker tag gcrxio/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
    

    启动代理:

    kubectl proxy

    启动成功后,可以通过该地址进行访问 Dashboard:

    http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

    进入 Dashboard 需要令牌,可以通过以下命令获取令牌:

    kubectl -n kube-system describe secret default| awk '$1=="token:"{print $2}'
    
    • minikube

    安装:

    curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.12.1/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
    

    ##dashboard password:

    kubectl -n kube-system describe secret default| awk ‘$1==”token:”{print $2}’\n

    验证kubectl集群配置

    kubectl cluster-info
    

    在本地创建多节点kubenet

    1. 查看当前所在集群信息
    kubectl cluster-info
    

    image-20200728225429941

    1. 查看集群的node数

      kubectl get nodes
      
    2. 启动dashboard

       minikube dashboard
    

    启动后会自动打开浏览器访问dashboard的地址:

    image-20200728230038597

    1. 本机只有一个节点,我要模拟多个节点

      minikube node add
      

      因为minikube添加节点会自动加入到当前集群中,而且会自动命名:

    image-20200728230645893

    1. 查看集群中节点数目
    kubectl get nodes
    

    image-20200728230818901

    ps: roles没有设置,暂时也不知道怎么设置

    在dashboard中也可以看到新加的nodes:

    image-20200728231031837

    部署应用

    由于我已经有两个节点了,那我部署应用应该至少设置2个及以上的pod数量

    创建Node.js应用程序

    下一步编写应用程序。将这段代码保存在一个名为hellonode的文件夹中,文件名server.js:

    server.js

    var http = require('http');
    
    var handleRequest = function(request, response) {
      console.log('Received request for URL: ' + request.url);
      response.writeHead(200);
      response.end('Hello World!');
    };
    var www = http.createServer(handleRequest);
    www.listen(8888);
    

    运行应用:

    node server.js
    

    curl http://localhost:8888

    返回:hello world !

    按Ctrl-C停止正在运行的Node.js服务器。

    下一步将应用程序打包到Docker容器中。

    创建Docker容器镜像

    在hellonode文件夹中创建一个Dockerfile命名的文件。Dockerfile描述了build的镜像,通过现有的镜像扩展(extend)build Docker容器镜像,本教程中的镜像扩展(extend)了现有的Node.js镜像。

    Dockerfile

    FROM node:10.16.3
    EXPOSE 8888
    COPY server.js .
    CMD node server.js
    

    本教程使用Minikube,而不是将Docker镜像push到registry,可以使用与Minikube VM相同的Docker主机构建镜像,以使镜像自动存在。为此,请确保使用Minikube Docker守护进程:

    eval $(minikube docker-env)
    

    注意:如果不在使用Minikube主机时,可以通过运行eval $(minikube docker-env -u)来撤消此更改。

    使用Minikube Docker守护进程build Docker镜像:

    docker build -t hello-node:v1 .
    

    好了Minikube VM可以运行构建好的镜像。

    由于我是在本地构建的image,所以为了防止在其它的node上重复下载image或者下载不到image,则执行镜像拉取:

    docker save hello-node:v1 | (eval $(minikube docker-env) && docker load)
    

    但是这种方式有问题,新建一个node,部署的时候,还是报错:

    image-20200729132310762

    在部署应用之前,我有两个节点,一个master一个node,但是master不承担应用节点负载,那么我再建立一个node:

    minikube node add
    

    生成了minikube-m03

    下载完了以后,部署一个deployment:

    kubectl run hello-node –image=hello-node:v1 –port=8888 –replicas=6

    只能先用笨办法,进入node节点机器,将镜像手动再build一下:

    minikube ssh -n minikube-m03

    由于在国内,因为墙的原因,新增的node节点无法下载镜像,则需要在启动minikube的时候,加上镜像地址:

    minikube start --registry-mirror=http://917ad9c3.m.daocloud.io,https://1nrb7s9c.mirror.aliyuncs.com,https://docker.mirrors.ustc.edu.cn --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
    

    创建Service

    默认情况,Pod只能通过Kubernetes群集内部IP访问。要使hello-node容器从Kubernetes虚拟网络外部访问,须要使用Kubernetes Service暴露Pod。(理论上就算用service暴露pod,也只能在kubectl内部的服务去访问)

    我们可以使用kubectl expose命令将Pod暴露到外部环境:

    kubectl expose deployment hello-node --type=LoadBalancer
    

    查看刚创建的Service:

    kubectl get services
    

    输出:

    image-20200729165959949

    将此service临时暴露出来,让宿主机可以访问:

    minikube service hello-node
    

    将打开浏览器,在本地IP地址为应用提供服务,显示“Hello World”的消息。

    最后可以查看到一些日志

    kubectl logs <POD-NAME>
    

    [参考文章]: (https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube “)”
    [例子参考]: http://docs.kubernetes.org.cn/94.html

    http://docs.kubernetes.org.cn/94.html

    ingressCntroller+ ingress+web

    开启minikube的ingressController插件

    我们有些后台服务是直接在外网上被调用的,比如给h5或者app提供服务的应用,

    在minikube上已经集成了ingressController。

    minikube addons enable ingress
    

    image-20200729191613728

    只要启动的时间加上–driver=hyperkit (这个是在mac上提示这样写的,但实际上无效,不支持开启插件)

    ps: 在mac平台下,minikube有个bug, 是不会成功的。

    只能切换到unbuntu上运行:

    minikube start --registry-mirror=http://917ad9c3.m.daocloud.io,https://1nrb7s9c.mirror.aliyuncs.com,https://docker.mirrors.ustc.edu.cn --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --driver=none
    

    ps: 目前这个是不可以的的

    问题已经在github上暴露出来了:

    https://github.com/kubernetes/minikube/pull/7393

    参考文章

    https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/

    验证ingressController是否开启成功

    kubectl get pods -n kube-system
    

    返回:

    NAME READY STATUS RESTARTS AGE
    coredns-546565776c-z5h75 1/1 Running 0 39m
    etcd-kubenode 1/1 Running 0 39m
    ingress-nginx-admission-create-x2rss 0/1 Completed 0 7m14s
    ingress-nginx-admission-patch-kzj24 0/1 Completed 1 7m14s
    ingress-nginx-controller-69ccf5d9d8-j5qnj 1/1 Running 0 7m14s
    kube-apiserver-kubenode 1/1 Running 0 39m
    kube-controller-manager-kubenode 1/1 Running 0 39m
    kube-proxy-kdgpn 1/1 Running 0 39m
    kube-scheduler-kubenode 1/1 Running 0 39m
    storage-provisioner 1/1 Running 0 39m

    image-20200729192245410

    配置ingress rule

    example-ingress.yaml:

      • kind: Ingress
         metadata:
           name: example-ingress
           annotations:
             nginx.ingress.kubernetes.io/rewrite-target: /$1
         spec:
           rules:
           - host: hello.node.info
             http:
               paths:
               - path: /
                 backend:
                   serviceName: hello-node
                   servicePort: 8888
        

    里面配置了一个指向规则,host:hello.node.info —-> backend:hello-node:8888

    查看ingress相关信息:

    ​ kubectl get ingress

    返回:

    image-20200729200624090

    hello.node.info这个域名是我自定义的,需要在访问的客户端里设置hosts,由于我是用的minikube安装的kubectl,我只要在客户端机器映射宿主机ip地址就行了.

    hosts:

    10.105.242.61 hello.node.info

    image-20200729195905769

    现在大功告成了!!!

    注意事项

    我有两套本地环境:

    1. mac os 10.15.6 Beta版
    • docker for desk
    • minikube
    1. unbuntu 18.03
    • minikube+kubadm

    不管是mac环境还是unbuntu环境,都对多节点模式支持不到位

    mac: 可以多节点操作,但多节点镜像共享有bug,不支持minikube的ingresscontroller插件

    linux: 不支持本地多节点,支持minikube的ingresscontroller插件

    docker desk for mac 安装ingressController

    1. 从官网下载deployment的yaml文件
    wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/cloud/deploy.yaml
    

    或者从github下载源码包:

    https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v0.34.1

    下载下来,找到deploy.yaml文件:

    /Users/sam/Downloads/ingress-nginx-controller-v0.34.1/deploy/static/provider/kind
    

    注意,官网上它发布了两种包:

    • ingress-nginx-xxx 必须结合helm才能部署执行
    • controller-v034.1 是源包

    2.下载镜像:

    因为deploy.yaml里的镜像地址,国内因为墙的原因,无法访问,所以我们将它的镜像地址改成阿里云的镜像地址:

    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
    

    ps: 因为阿里云没有0.34.1这个版本,所以换成了0.30.0

    ps: 找到了国内可以用的0.34镜像:

    docker pull siriuszg/nginx-ingress-controller:v0.34.1
    
    1. 启动ingressController

    将deploy.yaml 改名:ingress-nginx-controller.yaml

    kubectl apply -f ingress-nginx-controller.yaml
    

    查看是否启动成功:

    kubectl get pods -n ingress-nginx \\n  -l app.kubernetes.io/name=ingress-nginx --watch
    

    image-20200806114722687

    有两个adminssion没有启动,只是镜像下载完成了,我们看看什么原因:

    kubectl describe pod ingress-nginx-admission-patch-trcxc -n ingress-nginx
    

    事件日志:

    image-20200806114925870

    这个至于为什么,我暂时没找到解决办法,但这个pod不影响我们ingress-controller的正常运行,先不管了。

    我们看看ingress-controller 的service是否正常:

    kubectl get service -n ingress-nginx
    

    image-20200806120232485

    发现已经解析到本机的localhost了。

    我们看看:

    curl localhost

    image-20200806120520145

    我们因为之前已经部署了hello-node的pod服务,我们看看ingress是否生效:

    kubectl get ingress
    

    image-20200806120624455

    发现已经将我们自定义的host指向了address地址,我们访问看看:

    image-20200806121012329

    负载均衡已经起效。

    参考文章

    https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/

    https://kubernetes.github.io/ingress-nginx/deploy/

    更新镜像与服务

    更新应用程序

    编辑server.js文件以返回pod容器的ip:

     response.end('Hello World!'+'_'+ getIPAdress());
    

    完整server.js:

    var http = require('http');
    
    var handleRequest = function(request, response) {
      console.log('Received request for URL: ' + request.url);
      response.writeHead(200);
      response.end('Hello World!'+'_'+ getIPAdress());
    };
    var www = http.createServer(handleRequest);
    www.listen(8888);
    
    function getIPAdress() {
      let interfaces = require('os').networkInterfaces();
      for (var devName in interfaces) {
        var iface = interfaces[devName];
          for (var i = 0; i < iface.length; i++) {
            let alias = iface[i];
            if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
              console.log(alias.address);
            return alias.address;
            }
          }
      }
    }
    

    build新版本镜像

    docker build -t hello-node:v2 .
    

    Deployment更新镜像:

    kubectl set image deployment/hello-node hello-node=hello-node:v2
    

    再次运行应用以查看新消息:

    minikube service hello-node
    

    清理删除

    现在可以删除在集群中创建的资源:

    kubectl delete service hello-node
    kubectl delete deployment hello-node
    

    或者停止Minikube:

    minikube stop
    
    文章目录
    1. 1. k8s学习(一)
      1. 1.1. 安装
      2. 1.2. 1. 使用kubeadm安装kubectl
        1. 1.2.1. 设置墙内镜像地址
        2. 1.2.2. 安装docker-ce kubelet kubeadm kubectl
      3. 1.3. 2. MiniKube 安装
        1. 1.3.1. 启动minikube的时候,老是遇到端口被占用
      4. 1.4. mac环境
        1. 1.4.0.0.1. 安装后遇到的问题
      5. 1.4.0.1. 安装dashboard
  • 1.5. 在本地创建多节点kubenet
    1. 1.5.1. 部署应用
  • 1.6. 创建Node.js应用程序
  • 1.7. 创建Docker容器镜像
  • 1.8. 创建Service
    1. 1.8.1. ingressCntroller+ ingress+web
    2. 1.8.2. 开启minikube的ingressController插件
      1. 1.8.2.1. 验证ingressController是否开启成功
    3. 1.8.3. 配置ingress rule
    4. 1.8.4. 注意事项
    5. 1.8.5. docker desk for mac 安装ingressController
    6. 1.8.6. 更新镜像与服务
  • 1.9. 更新应用程序
  • 1.10. 清理删除