美文网首页Kubernetes权威指南纪念版 - 学习笔记
《Kubernetes权威指南-纪念版》/1.3 从一个简单的例

《Kubernetes权威指南-纪念版》/1.3 从一个简单的例

作者: skywalk_js | 来源:发表于2019-04-27 21:27 被阅读0次

    1.3 从一个简单的例子开始

    1.3.1 环境准备

    安装kubernetes

    # 操作系统环境 CentOS Linux release 7.6.1810 (3.10.0-957.1.3.el7.x86_64) 
    # 为便于实验关闭防火墙和selinux
    # 书中使用yum安装kubernetes、etcd,yum中版本较旧,本实验安装后版本为kubernetes-v1.5.2,etcd-v3.3.11,docker-1.13.1,docker会作为依赖被安装
    
    sudo yum install -y kubernetes etcd
    
    # 顺序启动
    sudo systemctl start etcd
    sudo systemctl start docker
    sudo systemctl start kube-apiserver
    sudo systemctl start kube-controller-manager
    sudo systemctl start kube-scheduler
    sudo systemctl start kubelet
    sudo systemctl start kube-proxy
    
    # 配置开机启动
    sudo systemctl enable etcd
    sudo systemctl enable docker
    sudo systemctl enable kube-apiserver
    sudo systemctl enable kube-controller-manager
    sudo systemctl enable kube-scheduler
    sudo systemctl enable kubelet
    sudo systemctl enable kube-proxy
    

    配置docker私有仓库

    # 实验环境使用不带认证的私有仓库从本地拉取镜像,如使用带认证的私有仓库,pod基础设施镜像不能在私有仓库中拉取,且应用的镜像需指定secret,目前未找到能够使基础设施镜像在带认证的私有仓库拉取的方法,相关的内容在下文中描述
    
    # 拉取registry镜像
    sudo docker pull registry
    
    # 创建仓库本地目录和认证信息
    sudo mkdir -p /root/docker-hub/registry
    sudo mkdir /root/docker-hub/auth
    sudo docker run --entrypoint htpasswd registry -Bbn [username] [password] > /root/docker-hub/auth/htpasswd
    
    # 创建带认证的私有仓库在5000端口
    sudo docker run -d -p 5000:5000 --restart=always --name docker-hub \
      -v /root/docker-hub/registry:/var/lib/registry \
      -v /root/docker-hub/auth:/auth \
      -e "REGISTRY_AUTH=htpasswd" \
      -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
      -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
      registry
    
    # 检查仓库运行
    sudo docker ps
    
    # 登录仓库,成功后会在/root/.docker/中创建config.json文件,保存认证信息,此文件可复制给集群中其他节点
    sudo docker login 192.168.56.56:5000
    >[username]
    >[password]
    
    # 停止仓库
    sudo docker stop docker-hub
    sudo docker rm -f docker-hub
    
    # 创建不带认证的仓库在5000端口
    sudo docker run -d -p 5000:5000 --restart=always --name docker-hub \
      -v /root/docker-hub/registry:/var/lib/registry \
      registry
     
    # 修改docker配置文件,使私有仓库能够进行http访问,并配置docker镜像加速地址
    # 修改/etc/docker/daemon.json为以下内容
    {
       "insecure-registries": ["192.168.56.56:5000"],
       "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    
    # 私有仓库pull、push测试,,以hello-world为例
    # 查看本地镜像
    sudo docker images
    # 从公有仓库拉取镜像
    sudo docker pull hello-world
    # 修改docker tag
    sudo docker tag docker.io/hello-world:latest 192.168.56.56:5000/hello-world:latest
    # push测试
    sudo docker push 192.168.56.56:5000/hello-world:latest
    # pull测试
    # 移除修改tag后的镜像
    sudo docker rmi 192.168.56.56:5000/hello-world:latest
    # 从本地仓库拉取镜像
    sudo docker pull 192.168.56.56:5000/hello-world:latest
    
    # 查看私有仓库中的镜像
    curl -XGET 192.168.56.56:5000/v2/_catalog
    curl -XGET 192.168.56.56:5000/v2/[image name]/tags/list
    # 在仓库包含认证时
    curl -XGET [username]:[password]@192.168.56.56:5000/v2/_catalog
    curl -XGET [username]:[password]@192.168.56.56:5000/v2/[image name]/tags/list
    

    在k8s中启动容器

    # 使用kubectl命令创建secret,方括号中内容根据实际情况改写
    # yaml部署文件中指定secret的内容在下文中描述
    # 创建secret是使k8s能够在带认真的仓库中拉去镜像,但是pod基础设施不能拉取,本例使用不带认证的私有仓库
    sudo kubectl create secret docker-registry [registrykey-private1] \
    --docker-server=[192.168.56.56:5000] \
    --docker-username=[voyager] \
    --docker-password=[voyager] \
    --docker-email=[voyager@domain.com]
    
    # 修改/etc/kubernetes/apiserver文件中KUBE_ADMISSION_CONTROL的值,删除SecurityContextDeny,ServiceAccount,解决安全认证相关的问题
    KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"
    
    # 修改/etc/kubernetes/kubelet文件中KUBELET_POD_INFRA_CONTAINER的值,使pod基础设施在本地仓库中拉取,解决基础设施的pull相关问题
    # 需要先将pod基础设施push到本地仓库中,本实验使用的的镜像为docker.io/xplenty/rhel7-pod-infrastructure
    KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=192.168.56.56:5000/pod-infrastructure:v3.4"
    
    # 解决dns相关问题
    # 本实验中未配置dns服务,为使服务间能够发现,需在yaml部署文件中指定相应pod的CLUSTER-IP,为获取该地址,应先启动mysql服务,获取mysql CLUSTER-IP地址后修改myweb的yaml文件,后启动myweb
    
    # 创建mysql rc文件
    apiVersion: v1
    kind: ReplicationController
    metadata: 
      name : mysql
    spec:
      replicas: 1
      selector: 
        app: mysql
      template: 
        metadata: 
          labels: 
            app: mysql
        spec:
          containers:
          - name: mysql
            image: 192.168.56.56:5000/mysql:5.7
            ports:
            - containerPort: 3306
            env:
            - name: MYSQL_ROOT_PASSWORD
              value: "123456"
    
    # 创建mysql svc文件
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
    spec:
      ports:
        - port: 3306
      selector:
        app: mysql
    
    # 创建myweb rc文件
    # MYSQL_SERVICE_HOST值为mysql启动后在k8s中的CLUSTER-IP
    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: myweb
    spec:
      replicas: 2
      selector:
        app: myweb
      template:
        metadata:
          labels:
            app: myweb
        spec:
          containers:
            - name: myweb
              image: 192.168.56.56:5000/tomcat-app:v1
              ports:
              - containerPort: 8080
              env:
              - name: MYSQL_SERVICE_HOST
                value: "10.254.185.39"
              - name: MYSQL_SERVICE_PORT
                value: "3306" 
    
    # 创建myweb svc文件
    apiVersion: v1
    kind: Service
    metadata:
      name: myweb
    spec:
      type: NodePort
      ports:
        - port: 8080
          nodePort: 30001
      selector:
        app: myweb
    
    # 拉取带认证的本地仓库中的镜像相关内容
    # 创建secret文件
    apiVersion: v1
    kind: Secret
    metadata:
      name: registrykey-private2
      namespace: default
    data:
        .dockerconfigjson: {base64 -w 0 ~/.docker/config.json}
    type: kubernetes.io/dockerconfigjson
    
    # 带secret时rc文件中的配置,以mysql为例
    apiVersion: v1
    kind: ReplicationController
    metadata: 
      name : mysql
    spec:
      replicas: 1
      selector: 
        app: mysql
      template: 
        metadata: 
          labels: 
            app: mysql
        spec:
          containers:
          - name: mysql
            image: 192.168.56.56:5000/mysql-master:latest
            ports:
            - containerPort: 3306
            env:
            - name: MYSQL_ROOT_PASSWORD
              value: "123456"
          imagePullSecrets:
          - name: registrykey-private1
    
    # 服务的启动
    # 创建mysql服务
    sudo kubectl create -f mysql-rc.yaml
    sudo kubectl create -f mysql-svc.yaml
    # 获取mysql服务的CLUSTER-IP
    sudo kubectl get svc
    # 修改myweb rc yaml文件中的MYSQL_SERVICE_HOST的值为mysql的CLUSTER-IP
    #创建myweb服务
    sudo kubectl create -f myweb-rc.yaml
    sudo kubectl create -f myweb-svc.yaml
    # 测试,浏览器访问http://192.168.56.56:30001/demo/
    

    疑问

    • 为什么k8s不能读取/root/.docker/config.json下的认证信息,需要启动secret
    • 怎样使pod基础服务能够在带认证的私有仓库中拉取
    • dns服务简单方便的部署方法

    参考文章

    相关文章

      网友评论

        本文标题:《Kubernetes权威指南-纪念版》/1.3 从一个简单的例

        本文链接:https://www.haomeiwen.com/subject/doelnqtx.html