DCOS(centos 7.4/7.6)

https://dcos.io/releases/
https://downloads.dcos.io/dcos/stable/1.12.0/dcos_generate_config.sh
https://docs.mesosphere.com/1.12/installing/production/

Nodes 要求:
Proxy/Bootstrap:用於安裝集羣的機器。必須安裝Docker(CentOS系統要用RedHat分支的1.13版本)
Master node:建議3或者5個,開發測試可用1個。4 cores 處理器,32GB RAM,120GB 硬盤。
             建議SSD硬盤掛載/var/lib/dcos。
			 /var/lib/dcos/mesos/master	日誌目錄
			 /var/lib/dcos/cockroach (企業版)CockroachDB
			 /var/lib/dcos/navstar Mnesia數據庫
			 /var/lib/dcos/secrets	(企業版)secrets保險箱
			 /var/lib/dcos/exhibitor Zookeeper數據庫
Agent node (public):建議6個以上,1個也能夠。2 cores 處理器,16GB RAM,60GB 硬盤。
					 /var 至少20GB 硬盤,能夠訪問外網或者內部的 Docker 倉庫。
					 必須關閉 firewalld,禁用 DNSmasq 釋放 53 端口。
			 /var/lib/mesos Master和Agent節點持久存儲在這個目錄,不要遠程掛載!<<<--
			 /var/lib/mesos/slave/slaves 任務的沙盒目錄
			 /var/lib/mesos/slave/volumes 框架使用的 ROOT 持久卷
			 /var/lib/mesos/docker/store 存儲 docker 鏡像層,用於提供 URC 容器
			 /var/lib/docker 存儲 docker 鏡像層,用於提供 docker 容器,不要遠程掛載!<<<--
Agent node (private):同上,只是 private agent node,能夠有更多個。

後面的安裝步驟假設有上面描述的 4個節點 安裝 dcos 集羣。 <<<---

其餘要求:(將在後面的安裝步驟中設置)
所有節點啓用 SSH (Secure shell)
所有節點啓用 ICMP (Internet Control Message Protocol)
(企業版)所有hostnames可以被 DNS 解析
每一個節點經過 bootstrap 節點訪問網絡
每一個節點經過 IP 鏈接本身和集羣其餘節點
(企業版)全部端口都應打開,以進行從管理節點到代理節點的來回通訊
UDP 必須打開才能進入管理節點上的端口 53。爲鏈接到集羣,Mesos 代理節點服務 (dcos-mesos-slave) 使用此端口查找 leader.mesos
建議爲 DC/OS 安裝使用高速互聯網鏈接。DC/OS 服務須要每秒至少 10 MBit。若是工件下載時間超過文件 /opt/mesosphere/etc/mesos-slave-common 中 MESOS_EXECUTOR_REGISTRATION_TIMEOUT 的值,某些 DC/OS 服務的安裝將失敗。MESOS_EXECUTOR_REGISTRATION_TIMEOUT 的默認值爲 10 分鐘。


安裝步驟:

系統:CentOS 7.4
語言:en_US.utf-8
文件系統: xfs with d_type
檢查目錄是否有ftype=1:
# xfs_info /var/lib | grep -C 10 ftype=1
檢查整個文件系統:
# df -Th
格式化新分區:# mkfs.xfs -n ftype=1 -f /dev/mesos/dcos
可使用符號連接將/var/lib下的docker、mesos、dcos,可嘗試以下方法:
# mkdir -p /export/mesos
# mount /dev/mesos/dcos /export/mesos
mkdir -p /export/mesos/{docker,mesos,dcos,registry}
systemctl stop docker
rm -rf /var/lib/{docker,mesos,docs,registry}
ln -s /export/mesos/docker /var/lib/docker
ln -s /export/mesos/mesos /var/lib/mesos
ln -s /export/mesos/dcos /var/lib/dcos
ln -s /export/mesos/registry /var/lib/registry
ls -l /var/lib/{docker,mesos,dcos,registry}
systemctl start docker && docker info | grep d_type

全程聯網,須要 root 權限
注意:下面涉及到ssh -t命令的,請分別運行,不要一塊粘貼到遠程終端上。
若是安裝失敗,請跳到最後面的「4. 卸載 dcos」,而後從新安裝。

1. 準備,在 bootstrap 節點配置SSH,而後遠程關閉SELinux、Firewalld等服務,安裝Docker等
1.1 配置SSH
假設不知道 root 帳戶密碼,但能夠 sudo 得到 root 權限,
能夠在普通帳戶建立 ssh key 後複製到 root 目錄,步驟以下:
$ ssh-keygen -t rsa    // 生成密鑰對,一路回車
$ ssh-copy-id master   // 複製本地公鑰到 master 節點此用戶的 authorized_keys 文件,須要輸入帳戶密碼
$ ssh-copy-id agent1   // 同上,複製到 agent1 節點,假設此節點是 public agent
$ ssh-copy-id agent2   // 同上,複製到 agent2 節點,假設此節點是 private agent

// 複製 ssh 給 root;禁用 sudo 密碼提示。方便後面遠程鏈接 root,須要輸入帳戶密碼
$ sudo mkdir -p /root/.ssh && sudo chmod 700 /root/.ssh && sudo cp ~/.ssh/* /root/.ssh/; echo '%wheel ALL=(ALL) NOPASSWD: ALL' | sudo tee -a /etc/sudoers
$ ssh -t master "sudo mkdir -p /root/.ssh && sudo chmod 700 /root/.ssh && sudo cp ~/.ssh/* /root/.ssh/; echo '%wheel ALL=(ALL) NOPASSWD: ALL' | sudo tee -a /etc/sudoers" 
$ ssh -t agent1 "sudo mkdir -p /root/.ssh && sudo chmod 700 /root/.ssh && sudo cp ~/.ssh/* /root/.ssh/; echo '%wheel ALL=(ALL) NOPASSWD: ALL' | sudo tee -a /etc/sudoers"
$ ssh -t agent2 "sudo mkdir -p /root/.ssh && sudo chmod 700 /root/.ssh && sudo cp ~/.ssh/* /root/.ssh/; echo '%wheel ALL=(ALL) NOPASSWD: ALL' | sudo tee -a /etc/sudoers"
$ sudo su    // 切換到 root
#            // 下面的操做均在 root 下執行,所以不寫 # 提示符了,也不加行尾註釋,方便複製

1.2 配置SELinux和firewalld等
// 先查看 SELinux 狀態,若是是 enabled 狀態,再進行關閉操做,而且重啓
sestatus
// 若是須要,sed 替換命令,能夠設置替換爲 permissive(centOS 不可設置爲啓用)
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config && reboot
ssh -t master "setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config && reboot"
ssh -t agent1 "setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config && reboot"
ssh -t agent2 "setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config && reboot"
// 建立 nogroup 和 docker 組
groupadd nogroup && groupadd docker
// 關閉 firewalld(centOS 必須關閉 firewalld),關閉 dnsmasq(釋放 53 端口,centos最小安裝無此服務)
systemctl stop firewalld && sudo systemctl disable firewalld
systemctl stop dnsmasq && sudo systemctl disable dnsmasq.service

ssh -t master "groupadd nogroup && groupadd docker"
ssh -t agent1 "groupadd nogroup && groupadd docker"
ssh -t agent2 "groupadd nogroup && groupadd docker"
ssh -t master "systemctl stop firewalld && sudo systemctl disable firewalld; systemctl stop dnsmasq && sudo systemctl disable dnsmasq.service"
ssh -t agent1 "systemctl stop firewalld && sudo systemctl disable firewalld; systemctl stop dnsmasq && sudo systemctl disable dnsmasq.service"
ssh -t agent2 "systemctl stop firewalld && sudo systemctl disable firewalld; systemctl stop dnsmasq && sudo systemctl disable dnsmasq.service"

1.3 安裝 Docker
卸載新版本的 docker-ce(若是存在),安裝 Redhat fork docker 1.13,啓動,啓用,查看版本
建議分別運行,以便查看是否安裝正確。
若是使用國內的centos安裝源,請參考:https://mirrors.tuna.tsinghua.edu.cn/help/centos/

yum remove -y docker-ce && yum install -y docker && systemctl start docker && systemctl enable docker && docker version
ssh -t master "yum remove -y docker-ce && yum install -y docker && systemctl start docker && systemctl enable docker && docker version"
ssh -t agent1 "yum remove -y docker-ce && yum install -y docker && systemctl start docker && systemctl enable docker && docker version"
ssh -t agent2 "yum remove -y docker-ce && yum install -y docker && systemctl start docker && systemctl enable docker && docker version"
若是發現錯誤,請檢查是否有文件衝突提示,加入到 yum remove 命令中。

配置Docker倉庫鏡像(國內,會覆蓋daemon.json)
echo '{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]}' > /etc/docker/daemon.json; systemctl restart docker; docker version
ssh -t master "echo '{\"registry-mirrors\": [\"https://docker.mirrors.ustc.edu.cn/\"]}' > /etc/docker/daemon.json; systemctl restart docker; docker version"
ssh -t agent1 "echo '{\"registry-mirrors\": [\"https://docker.mirrors.ustc.edu.cn/\"]}' > /etc/docker/daemon.json; systemctl restart docker; docker version"
ssh -t agent2 "echo '{\"registry-mirrors\": [\"https://docker.mirrors.ustc.edu.cn/\"]}' > /etc/docker/daemon.json; systemctl restart docker; docker version"

1.4 安裝其餘必要組件
yum install -y tar xz unzip curl ipset net-tools ntp
ssh -t master "yum install -y tar xz unzip curl ipset net-tools ntp"
ssh -t agent1 "yum install -y tar xz unzip curl ipset net-tools ntp"
ssh -t agent2 "yum install -y tar xz unzip curl ipset net-tools ntp"

1.5 啓用 NTP(網絡時間協議)
ntptime; adjtimex -p; timedatectl
ssh -t master "ntptime; adjtimex -p; timedatectl"
ssh -t agent1 "ntptime; adjtimex -p; timedatectl"
ssh -t agent2 "ntptime; adjtimex -p; timedatectl"

1.6 下載 dcos 安裝腳本(900MB左右)
cd /root
curl -O https://downloads.dcos.io/dcos/stable/dcos_generate_config.sh
// curl -O https://downloads.dcos.io/dcos/stable/1.12.0/dcos_generate_config.sh
chmod +x dcos_generate_config.sh

2. 建立配置文件
配置文件結構:
dcos_generate_config.sh
genconf/
genconf/config.yaml
genconf/ip-detect
genconf/ssh_keys

2.1 建立 genconf 目錄,複製 ssh key,建立 ip-detect 文件
mkdir -p genconf
cd genconf
cp /root/.ssh/id_rsa ssh-key
chmod 600 ssh-key

vi ip-detect
文件內容:
#!/usr/bin/env bash
# AWS:
# curl -fsSL http://169.254.169.254/latest/meta-data/local-ipv4
# GCE:
# curl -fsSl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/ip
set -o nounset -o errexit
echo $(ip addr|grep 192.168|grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1)
文件結束
請將文件中 192.168 替換爲本機的 ip 地址的前兩組數字。
chmod +x ip-detect
./ip-detect
查看是否顯示爲本機 ip

2.2 建立 config.yaml。參見:https://docs.mesosphere.com/1.12/installing/production/advanced-configuration/configuration-reference/#configuration-parameters
vi config.yaml
文件內容:
bootstrap_url: http://<bootstrap_ip>:80
ip_detect_public_filename: genconf/ip-detect
master_list:
- <master-private-ip-1>
# - <master-private-ip-2>
# - <master-private-ip-3>
public_agent_list:
- <public-agent-private-ip>
agent_list:
- <private-agent-private-ip-1>
# - <private-agent-private-ip-2>
cluster_name: DCOS
exhibitor_storage_backend: static
master_discovery: static
resolvers:
- 8.8.4.4
- 8.8.8.8
ssh_key_path: /genconf/ssh-key
ssh_port: 22
ssh_user: root
use_proxy: 'false'
# http_proxy: http://<user>:<pass>@<proxy_host>:<http_proxy_port>
# https_proxy: http://<user>:<pass>@<proxy_host>:<http_proxy_port>
# no_proxy:
# - '.mesos'
# - '.thisdcos.directory'
# - '.dcos.directory'
# - '.zk'
# - '127.0.0.1'
# - 'localhost'
enable_ipv6: 'false'
telemetry_enabled: 'false'
oauth_enabled: 'false'
文件結束
文件的最後兩行是關閉dcos體驗反饋和oauth登陸,社區版建議關閉。
resolvers最多能夠3個,如需解析內網主機名,要指定內網的 DNS。
若是指定代理,請同時配置 Docker 代理,見後面「2.4 配置 Docker 代理」
企業版可指定superuser_username和superuser_password_hash,密碼經過
bash dcos_generate_config.ee.sh --hash-password <superuser_password>
或者--set-superuser-password生成到config.yaml

2.3 返回 dcos_generate_config.sh 路徑,準備安裝
cd ..

2.4 配置 Docker 代理(可選)
mkdir -p /etc/systemd/system/docker.service.d
vi /etc/systemd/system/docker.service.d/http-proxy.conf
文件開始
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/" "HTTPS_PROXY=https://proxy.example.com:443/" "NO_PROXY=.mesos,.thisdcos.directory,.dcos.directory,.zk,127.0.0.1,localhost"
文件結束
systemctl daemon-reload && systemctl restart docker
驗證代理是否被加載:
systemctl show --property=Environment docker


3. 安裝 dcos
3.1 安裝 dcos
bash dcos_generate_config.sh
docker rm -f nginx
docker run -d -p 80:80 -v $PWD/genconf/serve:/usr/share/nginx/html:ro --restart=always --name nginx nginx
// 安裝 master 節點
ssh master
mkdir /tmp/dcos; cd /tmp/dcos
curl -O http://<bootstrap-ip>/dcos_install.sh
bash dcos_install.sh master
exit
// 安裝 agent1(public agent)節點
ssh agent1
mkdir /tmp/dcos; cd /tmp/dcos
curl -O http://<bootstrap-ip>/dcos_install.sh
bash dcos_install.sh slave_public
exit
// 安裝 agent2(private agent)節點
ssh agent2
mkdir /tmp/dcos; cd /tmp/dcos
curl -O http://<bootstrap-ip>/dcos_install.sh
bash dcos_install.sh slave
exit

若是安裝成功
監視 Exhibitor 頁面:顯示master節點的zookeeper的狀態,主節點融合大約須要 10 分鐘
http://<master-public-ip>:8181/exhibitor/v1/ui/index.html
DCOS主頁:
http://<public-master-ip>/

3.2 配置代理(可選)
注意:下面的proxy.env是連接文件,不要用文件複製命令替換,請用vi手動修改。
若是dcos須要代理訪問,只在前面的方式配置config.yaml和配置docker代理是不夠的,
還須要在每一個節點修改proxy.env。
檢查是否代理配置成功的方法之一是:訪問dcos界面的Catalog頁面,默認它會去官網的Universe中得到組件列表。

配置master節點代理
ssh master
vi /opt/mesosphere/etc/proxy.env
文件開始
http_proxy=http://<user>:<pass>@<proxy_host>:<http_proxy_port>
https_proxy=https://<user>:<pass>@<proxy_host>:<https_proxy_port>
no_proxy=".mesos,.thisdcos.directory,.dcos.directory,.zk,127.0.0.1,localhost"
文件結束
systemctl restart dcos-cosmos
systemctl restart dcos-adminrouter.service

配置public agent節點代理
ssh agent1
vi /opt/mesosphere/etc/proxy.env
文件開始
http_proxy=http://<user>:<pass>@<proxy_host>:<http_proxy_port>
https_proxy=https://<user>:<pass>@<proxy_host>:<https_proxy_port>
no_proxy=".mesos,.thisdcos.directory,.dcos.directory,.zk,127.0.0.1,localhost"
文件結束
systemctl restart dcos-mesos-slave-public

配置private agent節點代理
ssh agent1
vi /opt/mesosphere/etc/proxy.env
文件開始
http_proxy=http://<user>:<pass>@<proxy_host>:<http_proxy_port>
https_proxy=https://<user>:<pass>@<proxy_host>:<https_proxy_port>
no_proxy=".mesos,.thisdcos.directory,.dcos.directory,.zk,127.0.0.1,localhost"
文件結束
systemctl restart dcos-mesos-slave


3.3 安裝 dcos cli(可選)
dcos cli 能夠安裝到任何機器或者節點,而且有 windows、macOS和linux不一樣的版本。下面假設安裝到了 bootstrap 節點。
在 DCOS 頁面裏能夠經過左上角的下拉菜單安裝,也能夠手動安裝,注意地址的版本號:
curl -O https://downloads.dcos.io/binaries/cli/linux/x86-64/dcos-1.12/dcos
mv dcos /usr/local/bin
chmod +x dcos /usr/local/bin/dcos
注意:/usr/local/bin 路徑下的程序,默認不會加入 root 帳戶的 PATH 變量,建議返回普通用戶使用 dcos 命令。
使用前設置集羣地址
dcos cluster setup https://<master-IP>
dcos

3.4 安裝私有 Universe(可選)
在不鏈接外網使用 Universe 的方法
mkdir -p ~/universe && cd ~/universe
curl -v https://downloads.mesosphere.com/universe/public/local-universe.tar.gz -o local-universe.tar.gz
curl -v https://raw.githubusercontent.com/mesosphere/universe/version-3.x/docker/local-universe/dcos-local-universe-http.service -o dcos-local-universe-http.service
curl -v https://raw.githubusercontent.com/mesosphere/universe/version-3.x/docker/local-universe/dcos-local-universe-registry.service -o dcos-local-universe-registry.service
cd ..
scp -r universe <master-IP>:~
ssh -A <master-IP>
cd universe
mv dcos-local-universe-registry.service /etc/systemd/system/
mv dcos-local-universe-http.service /etc/systemd/system/
docker load < local-universe.tar.gz
systemctl daemon-reload
systemctl enable dcos-local-universe-http
systemctl enable dcos-local-universe-registry
systemctl start dcos-local-universe-http
systemctl start dcos-local-universe-registry
驗證服務是否成功
systemctl status dcos-local-universe-http
systemctl status dcos-local-universe-registry
若是有多個 Master 節點,那麼都須要安裝上面方法安裝。

說明:本小節的例子中,將 master.mesos 替換爲每一個真正的 Master 節點名,
若 dcos 命令的操做系統不識別節點名,可配置 hosts(/etc/hosts)

技巧:得到主機的IP的方法,假設主機名爲master.mesos
host master.mesos
host後面也能夠用ip得到主機名。

用 dcos 命令添加私有 Universe,若是有多個 Master 節點,須要所有加入
dcos package repo remove Universe
dcos package repo add local-universe http://master.mesos:8082/repo
注:從新添加官網 Universe(也可在 dcos 頁面的 Settings/Package Repositories 裏添加)
dcos package repo add Universe https://universe.mesosphere.com/repo

爲每一個 Master 節點配置 Docker 信任證書:
建立 Docker 證書
dcos node ssh --master-proxy --mesos-id=<mesos-id>
sudo mkdir -p /etc/docker/certs.d/master.mesos:5000
sudo curl -o /etc/docker/certs.d/master.mesos:5000/ca.crt http://master.mesos:8082/certs/domain.crt
sudo systemctl restart docker
添加到信任(openssl那行會建立<hash_number>)
sudo cp /etc/docker/certs.d/master.mesos:5000/ca.crt /var/lib/dcos/pki/tls/certs/docker-registry-ca.crt
cd /var/lib/dcos/pki/tls/certs/
openssl x509 -hash -noout -in docker-registry-ca.crt
sudo ln -s /var/lib/dcos/pki/tls/certs/docker-registry-ca.crt /var/lib/dcos/pki/tls/certs/<hash_number>.0
exit

完成後,DCOS的Catalog頁會顯示信任的包。
能夠手動建立一個可選的 Universe,
參見:https://docs.mesosphere.com/1.12/administering-clusters/deploying-a-local-dcos-universe/#selected-packages
例子:須要一個安裝了docker,請可以make,而且能鏈接網絡的linux機器
$ git clone https://github.com/mesosphere/universe.git --branch version-3.x
$ cd universe/docker/local-universe/
// 編譯 universe-base 鏡像
$ sudo make base
// 編譯 1.12 版本的自定義 local-universe 鏡像,最終會生成 local-universe.tar.gz
$ sudo make DCOS_VERSION=1.12 DCOS_PACKAGE_INCLUDE="cassandra:1.0.25-3.0.10,marathon:1.4.2" local-universe
$ sudo chmod 777 local-universe.tar.gz

3.5 私有 Docker Registry(可選)
除了使用 Docker hub,還可使用私有的 Docker Registry,有下面兩種狀況。
3.5.1 安裝 Universe 中的 Registry
參考:https://github.com/dcos/examples/tree/master/registry
內部的 Registry 服務虛擬地址默認是:registry.marathon.l4lb.thisdcos.directory:5000

方法一:使用自簽名證書配置 Docker Registry
應該使用第三方機構(如 Let's Encrypt)建立受權證書,下面的例子是如何使用自簽名證書。
注意:建立的證書必須安裝到每一個須要訪問 Docker Registry 的節點。

(1) 建立證書
在 bootstrap 節點
cd ~/genconf/serve
openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key -x509 -days 365 -out domain.crt
------
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:NY
Locality Name (eg, city) [Default City]:NYC
Organization Name (eg, company) [Default Company Ltd]:mycompany
Organizational Unit Name (eg, section) []:myorg
Common Name (eg, your name or your servers hostname) []:registry.marathon.l4lb.thisdcos.directory
Email Address []:myemailaddress@mesosphere.com
------
查看生成的 domain.crt (將做爲registry-certificate)和 domain.key(將做爲registry-key) 文件
ls -la domain.*
查看證書文件
cat domain.crt

(2) 分發證書到須要訪問 Docker Registry 的所有 agent 節點的下面位置:/etc/docker/certs.d/registry.marathon.l4lb.thisdcos.directory:5000/ca.crt
並將證書加入到受信任的證書列表裏。
mkdir -p /etc/docker/certs.d/registry.marathon.l4lb.thisdcos.directory:5000
cp domain.crt /etc/docker/certs.d/registry.marathon.l4lb.thisdcos.directory:5000/ca.crt
sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1; systemctl restart docker

ssh -t agent1 "mkdir -p /etc/docker/certs.d/registry.marathon.l4lb.thisdcos.directory:5000"
ssh -t agent2 "mkdir -p /etc/docker/certs.d/registry.marathon.l4lb.thisdcos.directory:5000"
scp domain.crt agent1:/etc/docker/certs.d/registry.marathon.l4lb.thisdcos.directory:5000/ca.crt
scp domain.crt agent2:/etc/docker/certs.d/registry.marathon.l4lb.thisdcos.directory:5000/ca.crt
ssh -t agent1 "sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1; systemctl restart docker"
ssh -t agent2 "sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1; systemctl restart docker"

(3) 在 dcos 界面的 Catalog 裏添加 Registry
配置修改以下:選擇Security頁
勾選 enable
填寫 http tls download ip 爲 bootstrap 的 ip 地址
其餘默認(http tls download port:80,http tls certificate filename:domain.crt,http tls key filename:domain.key)
安裝便可。

(4) 測試(可選)
(4.1) 添加一個 registry-frontend 服務
在 dcos 界面的 Services 裏添加一個新服務
選擇 Single Contrainer
Service ID:      /registry-frontend
Instances:       1
Container Image: konradkleine/docker-registry-frontend:v2
CPUs:            0.5
Memory (MiB):    128

Networking 頁面
Network Type:          Bridge
+ Add Service Endpoints
Container Port:        80
Service Endpoint Name: web
取消勾選 Assign Automatically (可選,設置Host Port方便之後直接訪問固定端口)
Host Port:             5555
勾選 Enable Load Balanced Service Address
Load Balanced Port:    8080

Health Checks 頁面
+ Add Health Check
Protocol:         HTTP
Service Endpoint: web
Path:             /

Environment 頁面
添加環境變量:
ENV_DOCKER_REGISTRY_HOST:    registry.marathon.l4lb.thisdcos.directory
ENV_DOCKER_REGISTRY_PORT:    5000
ENV_MODE_BROWSE_ONLY:        true
ENV_DOCKER_REGISTRY_USE_SSL: 1 (若是registry-frontend獲取不到資源,能夠去掉試試)
添加Labels:
DCOS_SERVICE_PORT_INDEX: 0
DCOS_SERVICE_NAME:       registry-frontend
HAPROXY_GROUP:           external
DCOS_SERVICE_SCHEME:     http

因爲不能直接訪問 http://DCOS/service/registry-frontend/
所以須要到DCOS的Services/registry-frontend 的Tasks頁面,點擊正在運行的實例,
Marathon Task Configuration節裏有 Host 和 Ports,請用這個地址直接訪問。

(4.2) push 一個 nginx
docker pull nginx
docker tag nginx registry.marathon.l4lb.thisdcos.directory:5000/nginx
docker push registry.marathon.l4lb.thisdcos.directory:5000/nginx


方法二:不安全的 Docker Registry(警告:僅測試使用)
    ~~~~~~~~
    !!!我測試沒法啓動docker,後來採用修改daemon.json的方法:
    ssh -t master "echo '{\"insecure-registries\": [\"registry.marathon.l4lb.thisdcos.directory:5000/\"]}' > /etc/docker/daemon.json; systemctl restart docker; docker version"
    ssh -t agent1 "echo '{\"insecure-registries\": [\"registry.marathon.l4lb.thisdcos.directory:5000/\"]}' > /etc/docker/daemon.json; systemctl restart docker; docker version"
    ssh -t agent2 "echo '{\"insecure-registries\": [\"registry.marathon.l4lb.thisdcos.directory:5000/\"]}' > /etc/docker/daemon.json; systemctl restart docker; docker version"
    ~~~~~~~~
不配置TLS證書,修改 docker 服務來忽略安全設置。
在全部的節點執行下面命令(請複製$後面及全部行):
$ sudo tee /etc/systemd/system/docker.service.d/override.conf  <<-'EOF'
[Service]
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// $OPTIONS \
         $DOCKER_STORAGE_OPTIONS \
         $DOCKER_NETWORK_OPTIONS \
         $BLOCK_REGISTRY \
         $INSECURE_REGISTRY \
         --storage-driver=overlay \
         --insecure-registry registry.marathon.l4lb.thisdcos.directory:5000 
EOF

systemctl daemon-reload
systemctl restart docker


3.5.2 安裝私有的 Docker Registry
假設已經有一個私有的 Docker Registry,地址是 some.docker.host.com
建立 docker.tar.gz,此文件就是 docker 登陸後的本機生成的記錄登陸信息的文件,打成了包。步驟以下:
首先登陸須要訪問的私有 Registry:
docker login some.docker.host.com
~~~~~~~~
    注意:若是是非https的地址,須要在加入以下到 /etc/docker/daemon.json
    {
      "insecure-registries" : ["myregistrydomain.com:5000"]
    }

    還能夠建立一個自簽名證書:
    https://docs.docker.com/registry/insecure/#docker-still-complains-about-the-certificate-when-using-authentication

    mkdir -p certs
    openssl req \
      -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
      -x509 -days 365 -out certs/domain.crt
    注意輸入正確的domain
    而後運行registry
    docker run -d \
      --restart=always \
      --name registry \
      -v `pwd`/certs:/certs \
      -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
      -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
      -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
      -p 443:443 \
      registry:2
    最後,可能須要參考前面3.4節,添加信任到 marathon-lb。
~~~~~~~~

而後打包
cd ~
tar -czf docker.tar.gz .docker
最後,複製到所有的節點的 /etc/ 下,好比:
scp docker.tar.gz master:/etc/
scp docker.tar.gz agent1:/etc/
scp docker.tar.gz agent2:/etc/

以後就能夠在服務定義的 json 中指定這個文件位置了,如:
"{  
  "id": "/some/name/or/id",
  "cpus": 1,
  "mem": 1024,
  "instances": 1,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "some.docker.host.com/namespace/repo"
    }
  },
  "fetch": [
    {
      "uri": "file:///etc/docker.tar.gz"
    }
  ]
}

固然也能夠指定一個http的地址,只要能下載到docker.tar.gz便可。


3.6 其餘技巧
關閉並禁用一個 agent
sudo systemctl kill -s SIGUSR1 dcos-mesos-slave && sudo systemctl stop dcos-mesos-slave
sudo systemctl kill -s SIGUSR1 dcos-mesos-slave-public && sudo systemctl stop dcos-mesos-slave-public

3.7 升級 dcos
升級前應查閱版本發佈文檔,避免出錯。
升級指 1.X -> 1.Y 的過程;修補是指 1.X.A -> 1.X.B;升級會重啓服務;修補不會影響服務運行,可是方式是同樣的。
在 bootstrap 節點生成升級文件:
dcos_generate_config.sh --generate-node-upgrade-script <installed_cluster_version>
企業版
dcos_generate_config.ee.sh --generate-node-upgrade-script <installed_cluster_version>
而後到每一個節點運行:
curl -O <Node upgrade script URL>
bash dcos_node_upgrade.sh
echo $?
返回0,表示完成升級。
注意:在升級或者修補 Master 節點前,手動刪除 /opt/mesosphere/lib/libltdl.so.7 可避免衝突失敗。


4. 卸載 dcos
注:官方未提供卸載說明。
在全部master和agent節點執行下面命令:
/opt/mesosphere/bin/pkgpanda uninstall
rm -rf /opt/mesosphere /opt/dcos-prereqs.installed /var/lib/{mesos,dcos,zookeeper,mesosphere} /var/log/mesos /etc/mesosphere /etc/profile.d/dcos.sh /etc/systemd/journald.conf.d/dcos.conf
rm -rf /etc/systemd/system/{dcos-*,dcos.*} /etc/systemd/system/multi-user.target.wants/{dcos-*,dcos.*}
ps -ef|egrep 'mesos|dcos'|grep -v grep|awk '{print $2}'|xargs kill -9
systemctl daemon-reload
rm -rf /tmp/dcos
還須要手動改回dns解析文件,不然agent節點不能訪問bootstrap,從新下載腳本:
vi /etc/resolv.conf
也能夠經過 bootstrap 節點 scp 覆蓋過來,如:
scp /etc/resolv.conf master:/etc/resolv.conf
scp /etc/resolv.conf agent1:/etc/resolv.conf
scp /etc/resolv.conf agent2:/etc/resolv.conf

可選重啓:reboot
若是出現 Systemd 錯誤,能夠強制重啓:reboot -f

在bootstrap節點,停用nginx,轉到dcos_generate_config.sh所在目錄,而後刪除多餘文件:
docker rm -f nginx
cd /root
rm -rf dcos-*.tar genconf/{*.json,serve,state}
而後能夠從新安裝dcos。


5. 問題

5.1 若是安裝某些服務(如:marathon-lb)運行失敗,在日誌中報告錯誤:
/usr/bin/docker-current: Error response from daemon: shim error: docker-runc not installed on system.
能夠在對應的節點裏配置 /etc/docker/daemon.json

"hosts": ["unix:///var/run/docker.sock","tcp://0.0.0.0:2375"],
"runtimes": {
    "docker-runc": {
        "path": "/usr/libexec/docker/docker-runc-current"
    }
},
"add-runtime": "docker-runc=/usr/libexec/docker/docker-runc-current",
"default-runtime": "docker-runc"

5.2 若是 dns 失敗,能夠手動更改 /opt/mesosphere/bin/gen_resolvconf.py,強制加入 dns 解析設置
contents += "search some.domain.com\n"   
contents += "nameserver 10.10.10.1\n"
contents += "nameserver 10.10.10.2\n"
而後重啓服務
systemctl restart dcos-adminrouter
systemctl restart dcos-mesos-dns
相關文章
相關標籤/搜索