美文网首页工作心得体会
docker 和k8s的基本学习

docker 和k8s的基本学习

作者: 魔王大柚子 | 来源:发表于2020-03-19 17:43 被阅读0次

    1 docker相关

    1.1 CentOS7系统配置国内yum源

        cd /etc/yum.repos.d/  #到yum源的目录
        mkdir repo_bak  #备份文件夹
        mv *.repo repo_bak/  #备份之前的源信息
        wget http://mirrors.aliyun.com/repo/Centos-7.repo #下载阿里源的数据
        yum clean all  #清楚所有的yum缓存
        yum makecache     # 生成yum缓存,可能需要一段时间
    

    1.2 centos docker 安装

        systemctl stop firewalld #关闭防火墙
        systemctl disable firewalld #禁用防火墙
        setenforce 0  #禁用SELINUX
        yum install -y yum-utils device-mapper-persistent-data lvm2 #安装必要系统工具
        yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #添加docker的yum源
        yum makecache fast #生产yum缓存
        yum -y install docker-ce #安装docker
        service docker start #启动服务
        systemctl enable docker #开机启动
        docker version #查看版本
    

    1.3 docker 基本组成和使用

    1.3.1 仓库,类似于应用商城

    1.3.1.1 上传、下载和搜索应用

                docker pull 镜像地址  #类似于从商城下载应用
                docker push 本地镜像  #类似于把做好的应用上传到商城
                docker search 名称  #搜索镜像
    

    1.3.1.2 建立http私有仓库(建议单独机器单独配置,一台机器或多台专门作为私有仓库)

                docker pull registry #下载镜像
                docker run -di --name=registry -p 5000:5000 registry  #启动私有仓库
                #浏览器访问http://机器地址:5000/v2/_catalog。若浏览器显示{"repositories":[]}则表示安装成功
                vi /etc/docker/daemon.json  
                {"insecure-registries":["机器地址:5000"]} #让docker信任私有仓库地址
                systemctl restart docker #重启docker
    

    1.3.1.3 上传镜像到私有仓库

                docker tag 现有镜像识别名 机器地址:5000/镜像名称  #(镜像名可自定义)
                docker push 机器地址:5000/镜像名称
                docker login --username=账号 地址
    

    1.3.2 镜像,类似于软件安装包

    1.3.2.1 镜像获取、查看、导出和移除

                docker pull 镜像地址  #类似于从商城下载应用
                docker build -f /path/to/a/Dockerfile #从Dockerfile创建
                docker load -i  镜像文件路径 #从文件加载,文件是docker save的文件
                docker images -a#查看镜像信息
                docker save 文件路径 #导出镜像文件
                docker rmi  镜像识别名 #从本地移除镜像
    

    1.3.3 容器,类似于安装好的应用,可以使用

    1.3.3.1 容器的管理

                docker run 镜像识别名 #创建一个新的容器并运行一个命令
                # --name="" 指定名称 -p: 指定端口映射,格式为:主机(宿主)端口:容器端口  -d: 后台运行容器,并返回容器ID  -it 输入终端的页面
                docker create 镜像识别名 #创建一个新的容器但不启动它
                docker start 容器识别名 #启动一个或多个已经被停止的容器
                docker stop 容器识别名 #停止一个运行中的容器  批量停止 docker container stop $(docker container ls -a -q)
                docker restart 容器识别名 #重启容器
                docker kill 容器识别名 #杀掉一个运行中的容器。和stop的区别在于强制
                docker rm 容器识别名 #删除一个或多个容器,必须要在停止后才能删除,功能类似于卸载 批量删除 docker container rm $(docker container ls -a -q)
                docker exec 容器识别名  运行指令  #在运行的容器中执行命令,docker exec -it 容器识别名 /bin/bash 进入命令行页面
    

    1.3.3.2 容器的操作

                docker ps 容器识别名 # 列出容器 类似 docker container ls 
                docker inspect 识别名 # 获取容器/镜像的元数据
                docker top 容器识别名 # 查看容器中运行的进程信息,类似linux 的 ps命令
                docker logs -f  容器识别名 # 获取容器的日志
                docker diff 容器识别名 #检查容器里文件结构的更改
                docker cp 路径 路径 #用于容器与主机之间的数据拷贝 docker cp  /本地 识别名:/路径
                docker commit 容器识别名 #从容器创建一个新的镜像,映射文件夹在文件不保存在新的镜像中
    

    1.3.4 样例:新建nginx的镜像

            安装docker完毕
            安装私有库:ku.prv
            了解:  日志文件位置:/var/log/nginx
                    配置文件位置: /etc/nginx
                    资源存放的位置: /usr/share/nginx/html
            docker pull nginx:latest #从官方下载镜像
            docker images #查看镜像存在
            docker run --name nginx-test -p 8080:80 -d nginx #运行镜像获得容器
            curl xxx:8080 #有信息返回即可
            echo "test12312313" >> /usr/share/nginx/html/index.html/index
            curl xxx:8080 #有信息含有test12312313
            docker exec 容器识别名 service nginx status #查看状态
            mkdir -p  /home/mydir/log    #创建目录
            docker cp 容器识别名:/var/log/nginx /home/mydir/log/ #复制日志文件到本地
            docker commit -m 'Nginx' -a 'test-Nginx' 容器识别名 #提交新的更新到新的镜像
            docker tag 新的镜像名 ku.prv:5000/镜像名:tag   #打一个tag标注新的库
            docker push ku.prv:5000/镜像名:tag  #上传到私有库 浏览器访问http://机器地址:5000/v2/_catalog,看是否上传成功
            docker stop nginx-test  #停止容器
            docker rm nginx-test  #移除容器
            #重开一个容器,添加映射
            docker run \
            -p 8080:80 \
            --name nginx_test \
            -v /home/mydir/log/:/var/log/nginx \
            -d nginx 
    

    2 Kubernetes

    2.1 准备信息

        上面的私有库安装完毕
        上面上传的自制nginx镜像
        配置完成yum源
        关闭所有防火墙
        再准备三台干净的服务器,不要提前安装docker
        当前服务器列表:
        10.0.0.22 ku
        10.0.0.23 matser
        10.0.0.24 test003
        10.0.0.25 test004
        #每个节点修改host,添加关联
        vim /etc/hosts
        #查看dns是否有指定跳转
        vim /etc/resolv.conf
    

    2.2 安装

    2.2.1 master 节点安装etcd

            #暂时考虑使用单点模式
            yum install etcd -y #安装etcd,类似键值对存储库
            #修改etcd 的配置文件
            vim /etc/etcd/etcd.conf
            # ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"  访问etcd的路径
            # ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
            systemctl start etcd.service #启动服务
            systemctl enable etcd.service  #开机启动
            etcdctl -C http://10.0.0.23:2379 cluster-health  #查看健康情况
    

    2.2.2 master 安装kubernetes

            yum install kubernetes-master.x86_64 -y #安装kube 版本为1.5.2 比较老,但可以用
            #修改配置文件
            vim /etc/kubernetes/apiserver 
            #KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
            #KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.23:2379"
            #KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" 
                       #删除ServiceAccount
            vim /etc/kubernetes/config
            #KUBE_MASTER="--master=http://10.0.0.23:8080" 设置外部访问接口
            #启动服务
            systemctl enable kube-apiserver.service
            systemctl start kube-apiserver.service
            systemctl enable kube-controller-manager.service
            systemctl start kube-controller-manager.service
            systemctl enable kube-scheduler.service
            systemctl start kube-scheduler.service
            #查看是否正常
            kubectl get componentstatus
            vim /etc/docker/daemon.json #{"insecure-registries":["10.0.0.22:5000"]}
    

    2.2.3 Node节点安装kubernetes

            #在节点的服务器中:
            #修改配置文件
            vim /etc/kubernetes/config #KUBE_MASTER="--master=http://10.0.0.23:8080" 设置master路径
            vim /etc/kubernetes/kubelet 
            #KUBELET_ADDRESS="--address=0.0.0.0"  设成0.0.0.0
            #KUBELET_HOSTNAME="--hostname-override=10.0.0.24" 设置node的ip
            #KUBELET_API_SERVER="--api-servers=http://10.0.0.23:8080" 设置master的路径
            #KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.22:5000/pod-infrastructure:latest"  此处下面说,修改成私有库地址或者快速地址
            #启动服务
            systemctl  start  kubelet.service 
            systemctl enable kubelet.service 
            systemctl start kube-proxy.service
            systemctl enable kube-proxy.service
            #在master服务器上:
            kubectl get nodes #查看状态,节点是否连接,可能有小延迟,需要等1分钟左右
    

    2.2.4 准备pod-infrastructure:latest

            如果docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest 顺利就跳过此步
            如果无法加载或者报错,考虑使用阿里源下载或者去搜索docker search pod-infrastructure较快的路径
            例如当前:docker pull docker.io/tianyebj/pod-infrastructure:latest 能下载
            docker tag docker.io/tianyebj/pod-infrastructure 10.0.0.22:5000/pod-infrastructure
            docker push 10.0.0.22:5000/pod-infrastructure  #上传私有库,由于要经常使用,较慢或者报错十分影响操作
            #修改配置文件
            /etc/kubernetes/kubelet
            #KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=docker.io/tianyebj/pod-infrastructure:latest"
            #或者
            #KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.22:5000/pod-infrastructure:latest" 
            #重启master所有服务
            for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do
            systemctl restart $SERVICES
            systemctl enable $SERVICES
            systemctl status $SERVICES
            done  
            #重启node所有服务
            for SERVICES in kube-proxy kubelet docker; do
            systemctl restart $SERVICES
            systemctl enable $SERVICES
            systemctl status $SERVICES
            done  
    

    2.2.5 所有节点安装flannel

            #在node服务器上:
            yum install flannel -y #安装
            # 修改flannel配置文件
            vim /etc/sysconfig/flanneld 
            #FLANNEL_ETCD_ENDPOINTS="http://10.0.0.23:2379" 使用master上安装的etcd的地址
            #FLANNEL_OPTIONS=" --iface=enp0s9" 绑定物理网卡名称,由于我是虚拟机双网卡,出现问题,必须绑定一个ip可以互联的网卡
            #在master服务器上
            etcdctl mk /atomic.io/network/config  '{ "Network": "172.100.0.0/16" }'
            #在node服务器上:
            #修改配置文件
            vim /usr/lib/systemd/system/docker.service 
            #添加 ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
            #启动所有服务
            systemctl daemon-reload 
            systemctl enable flanneld.service 
            systemctl restart flanneld.service 
            service docker restart
            systemctl restart kubelet.service
            systemctl restart kube-proxy.service
            #验证
            ifconfig #查看ip中是否存在flannel0和docker0的虚拟网卡
            docker pull busybox
            docker run -itd busybox
            # 在容器中,ifconfig 查看ip,是否存在ip
            #ping 其他容器中的ip,通就完成了
    

    2.3 使用

    2.3.1 获取信息

    kubectl get 指定类型 #列出某个类型的下属资源 pod 或者nodes 或者rs 或者 svc 等资源,-n 命名空间
    kubectl describe 指定类型  #查看某个资源的详细信息 操作同 get
    kubectl logs 指定pod #查看某个 pod 的日志
    kubectl explain 指定类型    # 查看资源的配置项
    

    2.3.2 增加信息

    kubectl create -f yaml文件路径  #新建资源,文件填写格式,使用kubectl explain查看
    kubectl create namespace hi #新建命名空间
    #新建pod
    ```
    apiVersion: v1 #模板的版本号,默认v1 ,可以使用kubectl api-versions查看版本号
    kind: Pod #类型
    metadata:
      name: myng 
      namespace: hi #命名空间
      labels:  #标签,服务主要调用
        app: myng
    spec:
      containers:  #容器信息
      - image: 10.0.0.22:5000/ng
        name: ng1
        ports:
        - containerPort: 80  #端口是容器内的端口
          protocol: TCP
    ```
    #新建rs,不需要新建pod
    ```
    apiVersion: extensions/v1beta1  #经过试验,此版本可以使用
    kind: ReplicaSet
    metadata:
      name: myngs
      namespace: hi
    spec:
      replicas: 5  #维持的数量
      selector:
        matchLabels:
          app: myng  #标签,服务主要调用
      template:
        metadata:
          labels:
            app: myng
        spec:
          containers:
          - name: myng
            image: 192.168.56.113:5000/ng
            ports:
            - containerPort: 80 #端口是容器内的端口
    ```
    #新建svc,映射端口使用
    ```
    piVersion: v1
    kind: Service
    metadata:
      name: myng
      namespace: hi
    spec:
      type: NodePort #使用后会在node端开放端口
      ports:
      - name: http
        port: 8081 #端口是内部其他pod调用的接口 8080~20000
        targetPort: 80  #端口是pod内部的端口 
        nodePort: 30801 #端口是外网可以访问的端口,30000~32000
      selector:
        app: myng  #之前pod或者rs的标签
    
    ```
    

    2.3.3 改数据

    kubectl edit 类型 #修改某个资源的配置项,格式类似get
    kubectl apply -f <新配置文件名.yaml> #应用某个资源的配置项,
        #会根据metadata中的元数据来查找目标资源,如果没有的话则直接新建,如果找到的话就依次比对配置文件之间有什么不同点,然后应用不同的配置
    

    2.3.4 删数据

    kubectl delete <资源类型> <资源名> #删除某个资源,kubectl delete pod --all  kubectl delete all --all 删除所有,格式类似get
    

    2.3.5 使用账号密码的镜像库

        kubectl create secret docker-registry 起名字 --docker-server=库的地址 --docker-username=账号 --docker-password=xxxxxx 
        在使用时:
        ```
        containers:
        - name: channel
          image: xxx
        ports:
        - containerPort: 9999
        imagePullSecrets:
        - name: 起名字
        ```
    

    相关文章

      网友评论

        本文标题:docker 和k8s的基本学习

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