工作心得体会

docker 和k8s的基本学习

2020-03-19  本文已影响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: 起名字
    ```
上一篇 下一篇

猜你喜欢

热点阅读