顯示具有 docker 標籤的文章。 顯示所有文章
顯示具有 docker 標籤的文章。 顯示所有文章

2017年4月28日 星期五

Docker 改用 overlayFS 檔案系統

Docker 要改用 Overlay 檔案系統,系統的 kernel 必須是 kernel-3.18 以上,
kernel-3.10 不支援 Overlay 格式。

作業系統: CentOS 7

1.將 OverlayFS 加到 module 目錄下
echo "overlay" > /etc/modules-load.d/overlay.conf

2.載入 overlay module
modprobe overlay
或者
reboot

3.增加 docker repo
vi /etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

4.安裝 Docker
yum install docker-engine

確認 selinux 狀態
sestatus -v

5.修改 Docker(v1.2...) Daemon 用 OverlayFS 啟動
vi /usr/lib/systemd/system/docker.service
[Service]
.....................
ExecStart=/usr/bin/dockerd --storage-driver=overlay
.....................

systemctl daemon-reload
systemctl start docker.service
systemctl enable docker.service

6.檢查是否使用 overlay
docker info | grep 'Storage Driver'

如果看到下列訊息表示己經使用 overlay:
Storage Driver: overlay

檢查 Container 和 OS 的磁碟空間,正常啟用 overlay 時,磁碟空間應該是一樣的。


2017年4月14日 星期五

Docker Swarm Cluster 及 WEB Load Balance 應用

操作主機 (CentOS 7):
docker1    192.168.60.201    #master + node 及 swarm management
docker2    192.168.60.202
docker3    192.168.60.203

三台全裝
yum install -y docker

master 執行
docker run --rm swarm create

會出現一串 Cluster ID 記下來,因為每次執行都會再產生不同的 cluster id。

node 執行
docker run -d swarm join --addr=192.168.60.201:2375 token://07956fde8d6cd1363d5ca0e3a403b136
docker run -d swarm join --addr=192.168.60.202:2375 token://07956fde8d6cd1363d5ca0e3a403b136
docker run -d swarm join --addr=192.168.60.203:2375 token://07956fde8d6cd1363d5ca0e3a403b136

node 執行
vi /etc/sysconfig/docker
OPTIONS='-H 0.0.0.0:2375 -H unix:///var/run/docker.sock'
systemctl restart docker.service

master 執行
2375 port 己經被 docker 使用,所以必須使用其他的 port 來管理 docker:

docker run -t -p 2376:2375 -t swarm manage token://07956fde8d6cd1363d5ca0e3a403b136

正常應出現三台 join 主機的訊息,按 Ctrl + C 跳脫

確認 join 主機
docker run --rm swarm list token://07956fde8d6cd1363d5ca0e3a403b136
或
docker -H 192.168.60.201:2376 info


主機重開機時,如果沒有設定讓 Container 隨主機開機啟動,都要手動啟動它。
利用下列指令 update 讓 Container 隨主機啟動:
查看 Container ID:
docker ps -a

update container:
docker update --restart=always Container_ID


測試:
1.master 本機執行(不是在 master 的 docker container 裡)
安裝 Nginx 套件:
yum install -y epel-release
yum install -y nginx

將下列程式碼加入 /etc/nginx/nginx.conf 中:

upstream nodes {
    server 192.168.60.203:8080 weight=1; #權重 = 1
    server 192.168.60.202:8080 weight=2; #權重 = 2
    server 192.168.60.201:8080 weight=3; #權重 = 3
}

server {
    listen 80;

    location / {
        proxy_pass http://nodes;
    }
}

2.master 從 docker.io PULL 測試網頁 image 裝到 node 上(有幾台 node 就執行幾次。我也不確定要這麼做嗎!!!!! 但我執行兩次只有兩台有 PULL。發現後再執行一次,三台 node 就都有 PULL 測試網頁了)

docker -H :2375 run -d -p 8080:80 cijie/haproxy-web-example:1.0.0

3.打開瀏覽器,輸入 master IP,就可看到 Container 的 ID 切換
http://192.168.60.201





2017年2月9日 星期四

CentOS 7 部署 Kubernetes

Kubernetes 架構主機環境:
在 /etc/hosts 新增:
192.168.60.153 c7-k8s01    #master
192.168.60.154 c7-k8s02
192.168.60.155 c7-k8s03
192.168.60.156 c7-k8s04

關閉防火牆
systemctl stop firewalld
systemctl disable firewalld

安裝 ntp 套件
yum install ntp
systemctl start ntpd
systemctl enable ntpd

設定 kubernetes master:
安裝 kubernetes 套件
yum install -y etcd kubernetes flannel

修改 /etc/etcd/etcd.conf
ETCD_NAME=default
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.60.153:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.60.153:2379 "

ETCD_ADVERTISE_CLIENT_URLS="http://192.168.60.153:2379"

修改 /etc/sysconfig/docker
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io --log-driver=journald'

修改 /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.60.153:8080"

修改 /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--address=0.0.0.0"
KUBE_MASTER="--master=http://192.168.60.153:8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.60.153:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"
KUBE_API_ARGS=""

修改 /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME="--hostname-override=c7-k8s01"
KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

啟動 ETCD、kubernetes 服務
for SERVICES in etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy; do
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICES
done

修改 /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.60.153:2379"

設定 etcd.conf 結合 flannel 服務
etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}'

再重啟動 ETCD、kubernetes 服務
for SERVICES in etcd flanneld docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy; do
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICES
done

檢查 kubernetes master 是否正常運作
kubectl get nodes      #出現 kubetnetes master node 名稱

遇到的問題:
/var/log/messages 一直出現:
the cluster IP 172.16.0.1 for service kubernetes/default is not within the service CIDR 10.254.0.0/16; please recreate
利用 kubectl get services --all-namespaces 顯示與設定的 cluster ip 網段不同
所以利用 kubectl delete services/kubernetes 將原來的設定刪除,kubernetes 會自動產生新的
再用 kubectl get services --all-namespaces 檢查一遍
/var/log/messages 己無錯誤訊息


以下所有安裝、設定步驟需在每一台 kubernetes nodes 上執行(在不同台 node 執行時會特別標註)
設定 kubernetes nodes:
安裝 flannel、kubernetes
yum install -y flannel kubernetes

修改 /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.60.153:2379"      #新版本改為 FLANNEL_ETCD_ENDPOINTS 參數

修改 /etc/kubernetes/config
KUBE_MASTER="--master=http://192.168.60.153:8080"      #輸入 kubernetes master 主機 IP

修改 /etc/kubernetes/kubelet    #在 c7-k8s02 修改
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME="--hostname_override=c7-k8s02"
KUBELET_API_SERVER="--api_servers=http://192.168.60.153:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

修改 /etc/kubernetes/kubelet    #在 c7-k8s03 修改
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME="--hostname_override=c7-k8s03"
KUBELET_API_SERVER="--api_servers=http://192.168.60.153:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

設定啟動 kube-proxy kubelet docker flanneld
systemctl daemon-reload
for SERVICES in kubelet kube-proxy docker flanneld; do
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICES
done
或者
systemctl daemon-reload
for SERVICES in kubelet kube-proxy docker flanneld; do
    systemctl restart $SERVICES
    systemctl status $SERVICES
done

遇到的問題:
/var/log/messages 一直出現:
unable to communicate with Rkt api service: rkt: cannot tcp Dial rkt api service: dial tcp 127.0.0.1:15441: getsockopt

解決方法:在安裝、設定 flannel 之前,docker 己經先安裝並設定好了,有可能會出現上面的錯訊訊息,這時必須刪掉舊的 docker 網路介面:
systemctl stop docker
ip link delete docker0
systemctl start docker
ip -4 a|grep inet


kubernetes 內建的主機狀態監控網頁
https://host_ip:4194

CubeCOS 虛擬機刪除網路介面,且主機內沒有 virtio 驅動程式成為孤島主機時,進行 virtio iso 掛載流程

 # 當 CubeCOS 虛擬機刪除網路介面,且主機內沒有 virtio 驅動程式成為孤島主機時,進行 virtio iso 掛載流程。 # 步驟一:確認目標虛擬機的底層名稱 # 在 Compute Node(計算節點)上列出運行中的 instance,並反查對應的 OpenSt...