文章目录
  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. 更新镜像与服务
  • 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在外面启动了,应该不要启动

    关闭

    sudo systemctl stop localkube

    sudo systemctl stop kubelet

    再执行:

    image-20200728095523717

    启动minkiube:

    minikube start --vm-driver=none

    image-20200728094442332

    查看状态:

    image-20200728094649289

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

    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

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

    docker pull 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 需要令牌,可以通过以下命令获取令牌:

    • minikube

    安装:

    ##dashboard password:

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

    验证kubectl集群配置

    在本地创建多节点kubenet

    1. 查看当前所在集群信息

    image-20200728225429941

    1. 查看集群的node数

    2. 启动dashboard

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

    image-20200728230038597

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

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

    image-20200728230645893

    1. 查看集群中节点数目

    image-20200728230818901

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

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

    image-20200728231031837

    部署应用

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

    创建Node.js应用程序

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

    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

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

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

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

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

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

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

    image-20200729132310762

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

    生成了minikube-m03

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

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

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

    minikube ssh -n minikube-m03

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

    创建Service

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

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

    查看刚创建的Service:

    输出:

    image-20200729165959949

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

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

    最后可以查看到一些日志

    [参考文章]: (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。

    image-20200729191613728

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

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

    只能切换到unbuntu上运行:

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

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

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

    参考文章

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

    验证ingressController是否开启成功

    返回:

    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:

      • ```shell
        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

    或者从github下载源码包:

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

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

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

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

    2.下载镜像:

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

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

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

    1. 启动ingressController

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

    查看是否启动成功:

    image-20200806114722687

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

    事件日志:

    image-20200806114925870

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

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

    image-20200806120232485

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

    我们看看:

    curl localhost

    image-20200806120520145

    我们因为之前已经部署了hello-node的pod服务,我们看看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:

    完整server.js:

    build新版本镜像

    Deployment更新镜像:

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

    清理删除

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

    或者停止Minikube:

    文章目录
    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. 更新镜像与服务
  • 1.9. 更新应用程序
  • 1.10. 清理删除