docker && kubernetes

docker && kubernetes

來自專欄遊戲服務端編程之路

docker

原理幾句話

  1. namespace實現隔離
  2. cgroup實現資源控制
  3. cow實現文件快速修改

基本概念

  • 鏡像

    • Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文 件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變數、用戶等)。鏡像 不包含任何動態數據,其內容在構建之後也不會被改變。
    • 分層存儲
    • 類 / 模板
  • 容器

    • 鏡像運行時實體
    • 本質是進程。擁有自己的root文件系統、自己的網路配置、自己的進程空間,甚 至自己的用戶ID空間
    • 容器內的進程是運行在一個隔離的環境里,使用起來,就好像是在一 個獨立於宿主的系統下操作一樣
  • 倉庫

    • Docker Registry
      • 存儲,分發鏡像的服務
    • Docker Registry包含多個倉庫,倉庫包含多個鏡像,不同鏡像用tag標識

安裝

  • vim /etc/apt/sources.list
  • add deb http.debian.net/debian jessie-backports main
  • apt-get update
  • apt-get install docker.io

指令

  • docker build
    • -t target
    • -f 指定Dockerfile路徑
  • docker

如何不用root執行docker命令

st=>start: Starte=>endcheck_group=>operation: cd /var/run && ls -alht | grep dockercond=>condition: 是否有docker groupadd_yourself_to_docker_group=>operation: gpasswd -a ${USER} dockergpasswd -a ${USER} docker,將自己加入到已有的docker group中add_docker_group=>operation: sudo groupadd docker,創建docker grouprestart_docker_service=>operation: sudo service docker restart, 重啟docker servicenewgrp=>operation: newgrp - docker,切換當前會話到新 group 或者重啟 X 會話st->check_group->condcond(yes)->add_yourself_to_docker_groupcond(no)->add_docker_groupadd_docker_group->add_yourself_to_docker_groupadd_yourself_to_docker_group->restart_docker_service->newgrp->e

Dockerfile 編寫

  • 格式

# commentINSTRUCTION arguments

  • ENV
    • ADD
    • COPY
    • ENV
    • EXPOSE
    • FROM
    • LABEL
    • STOPSIGNAL
    • USER
    • VOLUME
    • WORKDIR

docker使用關鍵點

  1. 用戶管理
  2. docker與宿主機如何文件共享
  3. 埠如何映射

docker源安裝

echo "deb http://apt.x.netease.com:8660/docker/repo debian-jessie main" > /etc/apt/sources.list.d/docker.listcurl http://apt.x.netease.com:8660/docker/gpg |apt-key add -apt-get update && apt-get install docker-engine

k8s

體系架構

核心組件

  • etcd保存了整個集群的狀態;
  • apiserver提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制;
  • controller manager負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等;
  • scheduler負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;
  • kubelet負責維護容器的生命周期,同時也負責Volume(CVI)和網路(CNI)的管理;
  • Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI);
  • kube-proxy負責為Service提供cluster內部的服務發現和負載均衡;

Add-ons

  • kube-dns負責為整個集群提供DNS服務
  • Ingress Controller為服務提供外網入口
  • Heapster提供資源監控
  • Dashboard提供GUI
  • Federation提供跨可用區的集群
  • Fluentd-elasticsearch提供集群日誌採集、存儲與查詢

自建集群無法啟動

  1. 源碼下載,執行hack/local-up-cluster.sh
  2. 無法啟動kubelet處理
  • 修改grub

    • 上面不行的話,嘗試update-grub && update-grub2

網路實現

  • Flannel

  1. Flannel是作為一個二進位文件的方式部署在每個node上,主要實現兩個功能:
  2. 為每個node分配subnet,容器將自動從該子網中獲取IP地址 當有node加入到網路中時,為每個node增加路由配置
  • 幾個關鍵名詞

  1. containerPort
  2. nodePort

    nodePort是kubernetes提供給集群外部客戶訪問service入口的一種方式(另一種方式是LoadBalancer),所以,<nodeIP>:nodePort 是提供給集群外部客戶訪問service的入口。
  3. targetPort

    targetPort是pod上的埠,從port和nodePort上到來的數據最終經過kube-proxy流入到後端pod的targetPort上進入容器。
  4. Port

    service暴露在cluster ip上的埠,<cluster ip>:port 是提供給集群內部客戶訪問service的入口。

參考資料

docs.docker.com/engine/

推薦閱讀:

跟我一起學docker(三)--鏡像的基本操作
跟我一起學docker(一)--認識

TAG:Kubernetes | Docker | 容器雲 |