航天龙梦软件源临时访问方法

heiher 发表了文章 • 0 个评论 • 152 次浏览 • 2018-05-04 11:03 • 来自相关话题

各位龙芯粉,龙梦软件源因备案问题被短暂关闭,期间请使用临时URL访问,造成不便敬请谅解。

源基地址:http://mirror.lemote.com:8000/fedora/
各位龙芯粉,龙梦软件源因备案问题被短暂关闭,期间请使用临时URL访问,造成不便敬请谅解。

源基地址:http://mirror.lemote.com:8000/fedora/

有关社区建设的一点想法

admin 发表了文章 • 4 个评论 • 286 次浏览 • 2018-04-26 12:42 • 来自相关话题

透明:社区目前已开放共享,包含pmon、kernel、loongnix、java、browser、media等各个项目的源码;后期陆续还会建立基于Docker、KVM的云平台,完善透明社区的管理、参与,加速更多的爱好者参与进来。质量:  通过开放源码,社区希望集思广益,收集一些有建设性的意见,或者参与进来,共同促进龙芯生态的发展,而不是一味的指责谩骂。学习:相信如果你真的参与进来了,对自身能力提高,知识的积累也是一个非常好的机会;社区愿意和大家一起成长,共同学习。

      我们不希望社区站点是一个互相谩骂攻击、不负责任的职责、抱怨的地方。而是希望大家都能爱护它,积极反馈问题,给出有建设性的建议,在促进龙芯生态发展的同时,也提高自己的能力以及学习水平。

      为维护社区良好的学习气氛,如果发现有不遵守规则的网友,我们会警告三次,然后拉黑,请理解!






  查看全部
  1. 透明:社区目前已开放共享,包含pmon、kernel、loongnix、java、browser、media等各个项目的源码;后期陆续还会建立基于Docker、KVM的云平台,完善透明社区的管理、参与,加速更多的爱好者参与进来。
  2. 质量:  通过开放源码,社区希望集思广益,收集一些有建设性的意见,或者参与进来,共同促进龙芯生态的发展,而不是一味的指责谩骂。
  3. 学习:相信如果你真的参与进来了,对自身能力提高,知识的积累也是一个非常好的机会;社区愿意和大家一起成长,共同学习。


      我们不希望社区站点是一个互相谩骂攻击、不负责任的职责、抱怨的地方。而是希望大家都能爱护它,积极反馈问题,给出有建设性的建议,在促进龙芯生态发展的同时,也提高自己的能力以及学习水平。

      为维护社区良好的学习气氛,如果发现有不遵守规则的网友,我们会警告三次,然后拉黑,请理解!

logo.png


 

(精品)(Docker系列之十一)龙芯平台kubernetes集群编译及部署方案

jiangxinshang 发表了文章 • 0 个评论 • 873 次浏览 • 2017-12-25 11:06 • 来自相关话题

 
 一、环境
操作系统: loongnix
内核: 3.10.84
go版本: go1.9.2 linux/mips64le
cfssl(1.2.0)
etcd(3.2.12)
flannel(0.9.1)
kubernetes(1.9.0)
需自定义go 的环境变量,这里设置的路径为/usr/share/gocodeexport GOPATH=/usr/share/gocode
三台机器:
master:10.20.42.17
node:   10.20.42.22
node:   10.20.42.172
 
二、编译cfssl源代码
1.创建代码存放目录
mkdir -p $GOPATH/src/github.com/cloudflare
2.下载并编译源代码
go get -u github.com/cloudflare/cfssl/cmd/cfssl
3.切换至二进制文件生成目录并查看文件
ls $GOPATH/bin
 
三、编译etcd源代码
参考文章(龙芯公有云系列之一)搭建分布式存储服务etcd
链接地址:http://ask.loongnix.org/?/article/93

四、编译flannel源代码
1.创建代码存放目录
 mkdir -p $GOPATH/src/github.com/coreos
2.切换至该目录并下载源代码
cd $GOPATH/src/github.com/coreos
git clone https://github.com/coreos/flannel.git
3.打开flannel文件夹,执行编译过程
cd flannel/
go build
4.查看编译的二进制文件
ls flannel
 
五、编译kubernetes源代码
Kubernetes对golang版本的要求
Kubernetes    requires Go
1.0 - 1.2         1.4.2
1.3, 1.4          1.6
1.5, 1.6          1.7 - 1.7.5
1.7                 1.8.1
1.8                 1.8.3
1.9+               1.9.1
本文档编译的Kubernetes为当前最新版本1.9.0;golang版本为1.9.2
 
Fork
1.访问 https://github.com/kubernetes/kubernetes
2.点击右上角fork按钮,fork一份代码到你的github帐号,方便后续的开发。
 
Clone fork 到本地
working_dir=$GOPATH/src/k8s.io
user=xxxx #你的github账户名
mkdir -p $working_dir
cd $working_dir
git clone https://github.com/$user/kubernetes.git
# 或: git clone git@github.com:$user/kubernetes.git

cd $working_dir/kubernetes
git remote add upstream https://github.com/kubernetes/kubernetes.git
# 或: git remote add upstream git@github.com:kubernetes/kubernetes.git

# 永远不向upstream的master分支进行push操作:
git remote set-url --push upstream no_push

# 确认你的远程配置生效
git remote -v

    origin    https://github.com/bearabby/kubernetes.git (fetch)
    origin    https://github.com/bearabby/kubernetes.git (push)
    upstream    https://github.com/kubernetes/kubernetes.git (fetch)
    upstream    no_push (push)

创建本地分支
cd $working_dir/kubernetes
git fetch upstream
git checkout master
git rebase upstream/master

git checkout -b loongsonfeature
 
Build
cd $working_dir/kubernetes
make

报错信息不多,多为一些函数或变量未对mips64le平台进行支持。修改内容见0001-Build-on-mips64le.patch
注意内存剩余不足会导致编译出错:”signal: killed”,解决办法是通过增加交换分区。
 

六、搭建kubernetes集群
1.拷贝二进制文件至/root/local/bin文件夹下
mkdir -p /root/local/bin
cp  $GOPATH/bin/cfssl  /root/local/bin 
cp  /usr/bin  /root/local/bin
cp $GOPATH/src/k8s.io/kubernetes/_output/local/go/bin/*  /root/local/bin
2.设置环境变量
export PATH=/root/local/bin:$PATH
3.设置部署集群所需参数
cd /root    /local/bin
cat > environment.sh <<EOF 
#!/usr/bin/bash
# TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
BOOTSTRAP_TOKEN="6c314aea8ff601079617b03df567e478"

# 最好使用 主机未用的网段 来定义服务网段和 Pod 网段
# 服务网段 (Service CIDR),部署前路由不可达,部署后集群内使用IP:Port可达
SERVICE_CIDR="10.254.0.0/16"

# POD 网段 (Cluster CIDR),部署前路由不可达,**部署后**路由可达(flanneld保证)
CLUSTER_CIDR="172.30.0.0/16"

# 服务端口范围 (NodePort Range)
export NODE_PORT_RANGE="8400-9000"

# etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://10.20.42.17:2379,https://10.20.42.22:2379,https://10.20.42.172:2379"

# flanneld 网络配置前缀
export FLANNEL_ETCD_PREFIX="/kubernetes/network"

# kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)
export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"

# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
export CLUSTER_DNS_SVC_IP="10.254.0.2"

# 集群 DNS 域名
export CLUSTER_DNS_DOMAIN="cluster.local."
EOF
 
4.创建 CA 证书和秘钥
(1)创建 CA 配置文件
 cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "8760h"
      }
    }
  }
}
EOF
参数说明:
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证;
client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证
(2)创建 CA 证书签名请求:
cat > ca-csr.json <<EOF
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048创建 CA 证书和秘钥

  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
参数说明:
"CN":Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
"O":Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
(3)生成 CA 证书和私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
(4)分发证书
拷贝证书到所有机器上(manager及node节点)
mkdir -p /etc/kubernetes/ssl
cp ca* /etc/kubernetes/ssl
 
5.部署高可用 etcd 集群
这三个节点复用 kubernetes master 机器,分别命名
etcd-host0:10.20.42.17
etcd-host1:10.20.42.22
etcd-host2:10.20.42.172
(1)设置etcd所需环境变量
export NODE_NAME=etcd-host0 # 当前部署的机器名称(随便定义,只要能区分不同机器即可)
export NODE_IP=10.20.42.17 # 当前部署的机器 IP
export NODE_IPS="10.20.42.17 10.20.42.22 10.20.42.172" # etcd 集群所有机器 IP
# etcd 集群间通信的IP和端口
export ETCD_NODES=etcd-host0=https://10.20.42.17:2380,etcd-host1=https://10.20.42.22:2380,etcd-host2=https://10.20.42.172:2380
# 导入用到的其它全局变量:ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR
source /root/local/bin/environment.sh
(2)创建 TLS 秘钥和证书
cat > etcd-csr.json <<EOF
{
  "CN": "etcd",
  "hosts": [
    "127.0.0.1",
    "${NODE_IP}"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
参数说明:hosts 字段指定授权使用该证书的 etcd 节点 IP;
(3)生成 etcd 证书和私钥:
cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/etc/kubernetes/ssl/ca-config.json \
  -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
mkdir -p /etc/etcd/ssl
mv etcd*.pem /etc/etcd/ssl
(4)创建 etcd 的 systemd unit 文件
mkdir -p /var/lib/etcd  # 必须先创建工作目录
 cat > etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos

[Service]
Environment=ETCD_UNSUPPORTED_ARCH=mips64le
Type=notify
WorkingDirectory=/var/lib/etcd/
ExecStart=/root/local/bin/etcd \\
  --name=${NODE_NAME} \\
  --cert-file=/etc/etcd/ssl/etcd.pem \\
  --key-file=/etc/etcd/ssl/etcd-key.pem \\
  --peer-cert-file=/etc/etcd/ssl/etcd.pem \\
  --peer-key-file=/etc/etcd/ssl/etcd-key.pem \\
  --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --initial-advertise-peer-urls=https://${NODE_IP}:2380 \\
  --listen-peer-urls=https://${NODE_IP}:2380 \\
  --listen-client-urls=https://${NODE_IP}:2379,http://127.0.0.1:2379 \\
  --advertise-client-urls=https://${NODE_IP}:2379 \\
  --initial-cluster-token=etcd-cluster-0 \\
  --initial-cluster=${ETCD_NODES} \\
  --initial-cluster-state=new \\
  --data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF
参数说明:
指定 etcd 的工作目录和数据目录为 /var/lib/etcd,需在启动服务前创建这个目录;
为了保证通信安全,需要指定 etcd 的公私钥(cert-file和key-file)、Peers 通信的公私钥和 CA 证书(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客户端的CA证书(trusted-ca-file);
--initial-cluster-state 值为 new 时,--name 的参数值必须位于 --initial-cluster 列表中;
 
(5)启动etcd服务
mv etcd.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
在所有的 etcd 节点重复上面的步骤,直到所有机器的 etcd 服务都已启动。
(6)验证服务
部署完 etcd 集群后,在任一 etcd 集群节点上执行如下命令
for ip in ${NODE_IPS}; do
  ETCDCTL_API=3 /root/local/bin/etcdctl \
  --endpoints=https://${ip}:2379  \
  --cacert=/etc/kubernetes/ssl/ca.pem \
  --cert=/etc/etcd/ssl/etcd.pem \
  --key=/etc/etcd/ssl/etcd-key.pem \
  endpoint health; done

预期结果:
https://10.20.42.17:2379 is healthy: successfully committed proposal: took = 1.246915ms
https://10.20.42.22:2379 is healthy: successfully committed proposal: took = 1.509229ms
https://10.20.42.172:2379 is healthy: successfully committed proposal: took = 1.519269ms
三台 etcd 的输出均为 healthy 时表示集群服务正常(忽略 warning 信息)。
 
6.部署 kubectl 命令行工具

kubectl 默认从 ~/.kube/config 配置文件获取访问 kube-apiserver 地址、证书、用户名等信息,如果没有配置该文件,执行命令时出错:
kubectl get pods
The connection to the server localhost:8080 was refused - did you specify the right host or port?
下面介绍配置 kubernetes 集群命令行工具 kubectl 的步骤。
需要将下载的 kubectl 二进制程序和生成的 ~/.kube/config 配置文件拷贝到所有使用 kubectl 命令的机器。
(1)部署 kubectl需要的变量
export MASTER_IP=10.64.3.7 
# 替换为 kubernetes master 集群任一机器 IP
export KUBE_APISERVER="https://${MASTER_IP}:6443"
说明:
变量 KUBE_APISERVER 指定 kubelet 访问的 kube-apiserver 的地址,后续被写入 ~/.kube/config 配置文件;
(2)创建 admin 证书
ubectl 与 kube-apiserver 的安全端口通信,需要为安全通信提供 TLS 证书和秘钥。
创建 admin 证书签名请求
cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": ,
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
EOF
参数说明:
后续 kube-apiserver 使用 RBAC 对客户端(如 kubelet、kube-proxy、Pod)请求进行授权;
kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings,如 cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予了调用kube-apiserver 所有 API的权限;
O 指定该证书的 Group 为 system:masters,kubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限;
hosts 属性值为空列表
(3)生成 admin 证书和私钥:
cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/etc/kubernetes/ssl/ca-config.json \
  -profile=kubernetes admin-csr.json | cfssljson -bare admin
mv admin*.pem /etc/kubernetes/ssl/
rm admin.csr admin-csr.json
(4)创建 kubectl kubeconfig 文件
# 设置集群参数
 kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER}
# 设置客户端认证参数
 kubectl config set-credentials admin \
  --client-certificate=/etc/kubernetes/ssl/admin.pem \
  --embed-certs=true \
  --client-key=/etc/kubernetes/ssl/admin-key.pem
 # 设置上下文参数
kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=admin
 # 设置默认上下文
 kubectl config use-context kubernetes
参数说明:
admin.pem 证书 O 字段值为 system:masters,kube-apiserver 预定义的 RoleBinding cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予了调用kube-apiserver 相关 API 的权限;
生成的 kubeconfig 被保存到 ~/.kube/config 文件;
(5)分发 kubeconfig 文件
将 ~/.kube/config 文件拷贝到运行 kubelet 命令的机器的 ~/.kube/ 目录下。
 
7.部署 Flannel 网络

(1)使用的变量
export NODE_IP=10.20.42.17 # 当前部署节点的 IP
# 导入用到的其它全局变量:ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR
 source /root/local/bin/environment.sh
(2)创建 TLS 秘钥和证书
  创建 flanneld 证书签名请求
cat > flanneld-csr.json <<EOF
{
  "CN": "flanneld",
  "hosts": ,
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
参数说明:
hosts 字段为空;
生成 flanneld 证书和私钥
cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/etc/kubernetes/ssl/ca-config.json \
  -profile=kubernetes flanneld-csr.json | cfssljson -bare flanneld
mkdir -p /etc/flanneld/ssl
mv flanneld*.pem /etc/flanneld/ssl
rm flanneld.csr  flanneld-csr.json
(3)向 etcd 写入集群 Pod 网段信息
/root/local/bin/etcdctl \
  --endpoints=${ETCD_ENDPOINTS} \
  --ca-file=/etc/kubernetes/ssl/ca.pem \
  --cert-file=/etc/flanneld/ssl/flanneld.pem \
  --key-file=/etc/flanneld/ssl/flanneld-key.pem \
  set ${FLANNEL_ETCD_PREFIX}/config '{"Network":"'${CLUSTER_CIDR}'", "SubnetLen": 24, "Backend": {"Type": "vxlan"}}'
参数说明:
flanneld 目前版本 (v0.7.1) 不支持 etcd v3,故使用 etcd v2 API 写入配置 key 和网段数据;
写入的 Pod 网段(${CLUSTER_CIDR},172.30.0.0/16) 必须与 kube-controller-manager 的 --cluster-cidr 选项值一致;
(4)创建 flanneld 的 systemd unit 文件
cat > flanneld.service << EOF
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
ExecStart=/root/local/bin/flannel \\
  -etcd-cafile=/etc/kubernetes/ssl/ca.pem \\
  -etcd-certfile=/etc/flanneld/ssl/flanneld.pem \\
  -etcd-keyfile=/etc/flanneld/ssl/flanneld-key.pem \\
  -etcd-endpoints=${ETCD_ENDPOINTS} \\
  -etcd-prefix=${FLANNEL_ETCD_PREFIX}
ExecStartPost=/root/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
EOF
(5)启动 flanneld
 cp flanneld.service /etc/systemd/system/
 systemctl daemon-reload
 systemctl enable flanneld
 systemctl start flanneld
 
出现错误:
I1218 11:00:26.022231 11623 main.go:482] Using interface with name enp5s0 and address 10.20.42.17
I1218 11:00:26.022478 11623 main.go:499] Defaulting external address to interface address (10.20.42.17)
2017-12-18 11:00:26.027271 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
I1218 11:00:26.027501 11623 main.go:234] Created subnet manager: Etcd Local Manager with Previous Subnet: 0.0.0.0/0
I1218 11:00:26.027560 11623 main.go:237] Installing signal handlers
I1218 11:00:26.197651 11623 main.go:347] Found network config - Backend type: vxlan
I1218 11:00:26.197811 11623 vxlan.go:119] VXLAN config: VNI=1 Port=0 GBP=false DirectRouting=false
E1218 11:00:26.200720 11623 main.go:279] Error registering network: operation not supported
I1218 11:00:26.200802 11623 main.go:327] Stopping shutdownHandler...
提示内容:网络注册失败
经查找,原因为:当前loongnix系统内核版本为3.10,而vxlan的最低内核版本为3.14+,所以无法部署flannel,部署工作暂时中止
 
kubernetes源代码及编译后的二进制文件下载地址 查看全部
timg.jpg

 
 一、环境
操作系统: loongnix
内核: 3.10.84
go版本: go1.9.2 linux/mips64le
cfssl(1.2.0)
etcd(3.2.12)
flannel(0.9.1)
kubernetes(1.9.0)
需自定义go 的环境变量,这里设置的路径为/usr/share/gocode
export GOPATH=/usr/share/gocode

三台机器:
master:10.20.42.17
node:   10.20.42.22
node:   10.20.42.172
 
二、编译cfssl源代码
1.创建代码存放目录
mkdir -p $GOPATH/src/github.com/cloudflare
2.下载并编译源代码
go get -u github.com/cloudflare/cfssl/cmd/cfssl
3.切换至二进制文件生成目录并查看文件
ls $GOPATH/bin
 
三、编译etcd源代码
参考文章(龙芯公有云系列之一)搭建分布式存储服务etcd
链接地址:http://ask.loongnix.org/?/article/93

四、编译flannel源代码
1.创建代码存放目录
 mkdir -p $GOPATH/src/github.com/coreos
2.切换至该目录并下载源代码
cd $GOPATH/src/github.com/coreos
git clone https://github.com/coreos/flannel.git
3.打开flannel文件夹,执行编译过程
cd flannel/
go build
4.查看编译的二进制文件
ls flannel
 
五、编译kubernetes源代码
Kubernetes对golang版本的要求
Kubernetes    requires Go
1.0 - 1.2         1.4.2
1.3, 1.4          1.6
1.5, 1.6          1.7 - 1.7.5
1.7                 1.8.1
1.8                 1.8.3
1.9+               1.9.1
本文档编译的Kubernetes为当前最新版本1.9.0;golang版本为1.9.2
 
Fork
1.访问 https://github.com/kubernetes/kubernetes
2.点击右上角fork按钮,fork一份代码到你的github帐号,方便后续的开发。
 
Clone fork 到本地
working_dir=$GOPATH/src/k8s.io
user=xxxx #你的github账户名
mkdir -p $working_dir
cd $working_dir
git clone https://github.com/$user/kubernetes.git
# 或: git clone git@github.com:$user/kubernetes.git

cd $working_dir/kubernetes
git remote add upstream https://github.com/kubernetes/kubernetes.git
# 或: git remote add upstream git@github.com:kubernetes/kubernetes.git

# 永远不向upstream的master分支进行push操作:
git remote set-url --push upstream no_push

# 确认你的远程配置生效
git remote -v

    origin    https://github.com/bearabby/kubernetes.git (fetch)
    origin    https://github.com/bearabby/kubernetes.git (push)
    upstream    https://github.com/kubernetes/kubernetes.git (fetch)
    upstream    no_push (push)

创建本地分支
cd $working_dir/kubernetes
git fetch upstream
git checkout master
git rebase upstream/master

git checkout -b loongsonfeature
 
Build
cd $working_dir/kubernetes
make

报错信息不多,多为一些函数或变量未对mips64le平台进行支持。修改内容见0001-Build-on-mips64le.patch
注意内存剩余不足会导致编译出错:”signal: killed”,解决办法是通过增加交换分区。
 

六、搭建kubernetes集群
1.拷贝二进制文件至/root/local/bin文件夹下
mkdir -p /root/local/bin
cp  $GOPATH/bin/cfssl  /root/local/bin 
cp  /usr/bin  /root/local/bin
cp $GOPATH/src/k8s.io/kubernetes/_output/local/go/bin/*  /root/local/bin
2.设置环境变量
export PATH=/root/local/bin:$PATH
3.设置部署集群所需参数
cd /root    /local/bin
cat > environment.sh <<EOF 
#!/usr/bin/bash
# TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
BOOTSTRAP_TOKEN="6c314aea8ff601079617b03df567e478"

# 最好使用 主机未用的网段 来定义服务网段和 Pod 网段
# 服务网段 (Service CIDR),部署前路由不可达,部署后集群内使用IP:Port可达
SERVICE_CIDR="10.254.0.0/16"

# POD 网段 (Cluster CIDR),部署前路由不可达,**部署后**路由可达(flanneld保证)
CLUSTER_CIDR="172.30.0.0/16"

# 服务端口范围 (NodePort Range)
export NODE_PORT_RANGE="8400-9000"

# etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://10.20.42.17:2379,https://10.20.42.22:2379,https://10.20.42.172:2379"

# flanneld 网络配置前缀
export FLANNEL_ETCD_PREFIX="/kubernetes/network"

# kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)
export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"

# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
export CLUSTER_DNS_SVC_IP="10.254.0.2"

# 集群 DNS 域名
export CLUSTER_DNS_DOMAIN="cluster.local."
EOF
 
4.创建 CA 证书和秘钥
(1)创建 CA 配置文件
 cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "8760h"
      }
    }
  }
}
EOF
参数说明:
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证;
client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证
(2)创建 CA 证书签名请求:
cat > ca-csr.json <<EOF
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048创建 CA 证书和秘钥

  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
参数说明:
"CN":Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
"O":Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
(3)生成 CA 证书和私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
(4)分发证书
拷贝证书到所有机器上(manager及node节点)
mkdir -p /etc/kubernetes/ssl
cp ca* /etc/kubernetes/ssl
 
5.部署高可用 etcd 集群
这三个节点复用 kubernetes master 机器,分别命名
etcd-host0:10.20.42.17
etcd-host1:10.20.42.22
etcd-host2:10.20.42.172
(1)设置etcd所需环境变量
export NODE_NAME=etcd-host0 # 当前部署的机器名称(随便定义,只要能区分不同机器即可)
export NODE_IP=10.20.42.17 # 当前部署的机器 IP
export NODE_IPS="10.20.42.17 10.20.42.22 10.20.42.172" # etcd 集群所有机器 IP
# etcd 集群间通信的IP和端口
export ETCD_NODES=etcd-host0=https://10.20.42.17:2380,etcd-host1=https://10.20.42.22:2380,etcd-host2=https://10.20.42.172:2380
# 导入用到的其它全局变量:ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR
source /root/local/bin/environment.sh
(2)创建 TLS 秘钥和证书
cat > etcd-csr.json <<EOF
{
  "CN": "etcd",
  "hosts": [
    "127.0.0.1",
    "${NODE_IP}"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
参数说明:hosts 字段指定授权使用该证书的 etcd 节点 IP;
(3)生成 etcd 证书和私钥:
cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/etc/kubernetes/ssl/ca-config.json \
  -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
mkdir -p /etc/etcd/ssl
mv etcd*.pem /etc/etcd/ssl
(4)创建 etcd 的 systemd unit 文件
mkdir -p /var/lib/etcd  # 必须先创建工作目录
 cat > etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos

[Service]
Environment=ETCD_UNSUPPORTED_ARCH=mips64le
Type=notify
WorkingDirectory=/var/lib/etcd/
ExecStart=/root/local/bin/etcd \\
  --name=${NODE_NAME} \\
  --cert-file=/etc/etcd/ssl/etcd.pem \\
  --key-file=/etc/etcd/ssl/etcd-key.pem \\
  --peer-cert-file=/etc/etcd/ssl/etcd.pem \\
  --peer-key-file=/etc/etcd/ssl/etcd-key.pem \\
  --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --initial-advertise-peer-urls=https://${NODE_IP}:2380 \\
  --listen-peer-urls=https://${NODE_IP}:2380 \\
  --listen-client-urls=https://${NODE_IP}:2379,http://127.0.0.1:2379 \\
  --advertise-client-urls=https://${NODE_IP}:2379 \\
  --initial-cluster-token=etcd-cluster-0 \\
  --initial-cluster=${ETCD_NODES} \\
  --initial-cluster-state=new \\
  --data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF
参数说明:
指定 etcd 的工作目录和数据目录为 /var/lib/etcd,需在启动服务前创建这个目录;
为了保证通信安全,需要指定 etcd 的公私钥(cert-file和key-file)、Peers 通信的公私钥和 CA 证书(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客户端的CA证书(trusted-ca-file);
--initial-cluster-state 值为 new 时,--name 的参数值必须位于 --initial-cluster 列表中;
 
(5)启动etcd服务
mv etcd.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
在所有的 etcd 节点重复上面的步骤,直到所有机器的 etcd 服务都已启动。
(6)验证服务
部署完 etcd 集群后,在任一 etcd 集群节点上执行如下命令
for ip in ${NODE_IPS}; do
  ETCDCTL_API=3 /root/local/bin/etcdctl \
  --endpoints=https://${ip}:2379  \
  --cacert=/etc/kubernetes/ssl/ca.pem \
  --cert=/etc/etcd/ssl/etcd.pem \
  --key=/etc/etcd/ssl/etcd-key.pem \
  endpoint health; done

预期结果:
https://10.20.42.17:2379 is healthy: successfully committed proposal: took = 1.246915ms
https://10.20.42.22:2379 is healthy: successfully committed proposal: took = 1.509229ms
https://10.20.42.172:2379 is healthy: successfully committed proposal: took = 1.519269ms
三台 etcd 的输出均为 healthy 时表示集群服务正常(忽略 warning 信息)。
 
6.部署 kubectl 命令行工具

kubectl 默认从 ~/.kube/config 配置文件获取访问 kube-apiserver 地址、证书、用户名等信息,如果没有配置该文件,执行命令时出错:
kubectl get pods
The connection to the server localhost:8080 was refused - did you specify the right host or port?
下面介绍配置 kubernetes 集群命令行工具 kubectl 的步骤。
需要将下载的 kubectl 二进制程序和生成的 ~/.kube/config 配置文件拷贝到所有使用 kubectl 命令的机器。
(1)部署 kubectl需要的变量
export MASTER_IP=10.64.3.7 
# 替换为 kubernetes master 集群任一机器 IP
export KUBE_APISERVER="https://${MASTER_IP}:6443"
说明:
变量 KUBE_APISERVER 指定 kubelet 访问的 kube-apiserver 的地址,后续被写入 ~/.kube/config 配置文件;
(2)创建 admin 证书
ubectl 与 kube-apiserver 的安全端口通信,需要为安全通信提供 TLS 证书和秘钥。
创建 admin 证书签名请求
cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": ,
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
EOF
参数说明:
后续 kube-apiserver 使用 RBAC 对客户端(如 kubelet、kube-proxy、Pod)请求进行授权;
kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings,如 cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予了调用kube-apiserver 所有 API的权限;
O 指定该证书的 Group 为 system:masters,kubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限;
hosts 属性值为空列表
(3)生成 admin 证书和私钥:
cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/etc/kubernetes/ssl/ca-config.json \
  -profile=kubernetes admin-csr.json | cfssljson -bare admin
mv admin*.pem /etc/kubernetes/ssl/
rm admin.csr admin-csr.json
(4)创建 kubectl kubeconfig 文件
# 设置集群参数
 kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER}
# 设置客户端认证参数
 kubectl config set-credentials admin \
  --client-certificate=/etc/kubernetes/ssl/admin.pem \
  --embed-certs=true \
  --client-key=/etc/kubernetes/ssl/admin-key.pem
 # 设置上下文参数
kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=admin
 # 设置默认上下文
 kubectl config use-context kubernetes
参数说明:
admin.pem 证书 O 字段值为 system:masters,kube-apiserver 预定义的 RoleBinding cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予了调用kube-apiserver 相关 API 的权限;
生成的 kubeconfig 被保存到 ~/.kube/config 文件;
(5)分发 kubeconfig 文件
将 ~/.kube/config 文件拷贝到运行 kubelet 命令的机器的 ~/.kube/ 目录下。
 
7.部署 Flannel 网络

(1)使用的变量
export NODE_IP=10.20.42.17 # 当前部署节点的 IP
# 导入用到的其它全局变量:ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR
 source /root/local/bin/environment.sh
(2)创建 TLS 秘钥和证书
  创建 flanneld 证书签名请求
cat > flanneld-csr.json <<EOF
{
  "CN": "flanneld",
  "hosts": ,
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
参数说明:
hosts 字段为空;
生成 flanneld 证书和私钥
cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/etc/kubernetes/ssl/ca-config.json \
  -profile=kubernetes flanneld-csr.json | cfssljson -bare flanneld
mkdir -p /etc/flanneld/ssl
mv flanneld*.pem /etc/flanneld/ssl
rm flanneld.csr  flanneld-csr.json
(3)向 etcd 写入集群 Pod 网段信息
/root/local/bin/etcdctl \
  --endpoints=${ETCD_ENDPOINTS} \
  --ca-file=/etc/kubernetes/ssl/ca.pem \
  --cert-file=/etc/flanneld/ssl/flanneld.pem \
  --key-file=/etc/flanneld/ssl/flanneld-key.pem \
  set ${FLANNEL_ETCD_PREFIX}/config '{"Network":"'${CLUSTER_CIDR}'", "SubnetLen": 24, "Backend": {"Type": "vxlan"}}'
参数说明:
flanneld 目前版本 (v0.7.1) 不支持 etcd v3,故使用 etcd v2 API 写入配置 key 和网段数据;
写入的 Pod 网段(${CLUSTER_CIDR},172.30.0.0/16) 必须与 kube-controller-manager 的 --cluster-cidr 选项值一致;
(4)创建 flanneld 的 systemd unit 文件
cat > flanneld.service << EOF
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
ExecStart=/root/local/bin/flannel \\
  -etcd-cafile=/etc/kubernetes/ssl/ca.pem \\
  -etcd-certfile=/etc/flanneld/ssl/flanneld.pem \\
  -etcd-keyfile=/etc/flanneld/ssl/flanneld-key.pem \\
  -etcd-endpoints=${ETCD_ENDPOINTS} \\
  -etcd-prefix=${FLANNEL_ETCD_PREFIX}
ExecStartPost=/root/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
EOF
(5)启动 flanneld
 cp flanneld.service /etc/systemd/system/
 systemctl daemon-reload
 systemctl enable flanneld
 systemctl start flanneld
 
出现错误:
I1218 11:00:26.022231 11623 main.go:482] Using interface with name enp5s0 and address 10.20.42.17
I1218 11:00:26.022478 11623 main.go:499] Defaulting external address to interface address (10.20.42.17)
2017-12-18 11:00:26.027271 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
I1218 11:00:26.027501 11623 main.go:234] Created subnet manager: Etcd Local Manager with Previous Subnet: 0.0.0.0/0
I1218 11:00:26.027560 11623 main.go:237] Installing signal handlers
I1218 11:00:26.197651 11623 main.go:347] Found network config - Backend type: vxlan
I1218 11:00:26.197811 11623 vxlan.go:119] VXLAN config: VNI=1 Port=0 GBP=false DirectRouting=false
E1218 11:00:26.200720 11623 main.go:279] Error registering network: operation not supported
I1218 11:00:26.200802 11623 main.go:327] Stopping shutdownHandler...
提示内容:网络注册失败
经查找,原因为:当前loongnix系统内核版本为3.10,而vxlan的最低内核版本为3.14+,所以无法部署flannel,部署工作暂时中止
 
kubernetes源代码及编译后的二进制文件下载地址

《在龙芯上自己编写“壁纸切换器”》

renyafei 发表了文章 • 3 个评论 • 297 次浏览 • 2017-12-13 11:38 • 来自相关话题

为什么要在龙芯平台上编写"壁纸切换器"
              因为在Linux上没有找到好的开源软件,例如360壁纸软件、PC机上的动态壁纸软件都没有再龙芯平台上更好的兼容。所以需要编写能在龙芯平台运行的“壁纸切换器”。
开发语言:为什么要使用Python?
             Python语言的优点:免费、开源、可高层语言、可移植性、解释性、面向对象、可扩展性、丰富的库、规范的代码等,由于Python的开源本质和可移植性的特点,Python已经被移植在许多平台上,这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台!所以Python程序无需修改就可以在上述任何平台上面运行!而且Python语言写的程序不需要编译成二进制代码,可以直接从源代码运行程序。
程序架构

             配置文件:.wallpaper.conf 使用的是json的格式
             为什么使用json?
             JSON是一种轻量级的数据交换格式,它基于JavaScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

             读取图片文件:一是本机上存放的图片,二是络上的FTP存放的图片
              读取本机上的主要任务是,根据配置文件中图片的目录,读取该目录下的所有图片名称,再根据目录加集合里的图片名称用dconf命令更改桌面背景图片,和修改锁定屏幕的背景图片
读取FTP上的图片,首先要根据FTP上存放图片的路径,把图片读取到本机上,再根据本机上的目录,读取该目录下的所有图片名称,再根据目录加集合里的图片名称用dconf命令更改桌面背景图片,和修改锁定屏幕的背景图片。
            
             怎样更新壁纸:手动修改.wallpaper.conf配置文件后,进入终端以root用户执行   # python changeconfig.py               命令,就会重新读取修改后的图片目录。

            开机后执行壁纸切换:
             向/etc/xdg/autostart/目录下,增加了wallpaper.desktop文件,那么Fedora21操作系统就会开机自启动壁纸切换。
 
            定时运行:
            根据配置文件制定的时间,利用sleep()函数来执行定时切换图片的功能。
 
            更新配置:信号机制
              在主程序中,我们首先使用signal.signal()函数来预设信号处理函数。等待信号,当信号SIGUSR1被传递给该进程时,进程从暂停中恢复,并根据预设,执行SIGTSTP的信号处理函数myHandler()。我们可以根据自己的需要更改myHandler()中的操作,以针对不同的信号实现个性化的处理。

            后台程序,自动运行  
            在打开终端后,以root用户运行wallpaper-1.0.1.sh后,可以关闭终端,进程会在后台运行,会定时切换壁纸。
网址
               本项目已经开放代码 https://github.com/renyafei-loongson/wallpaper
 
总结
            龙芯已经具有自由开发应用的能力,龙芯应用生态必将蓬勃发展。





















  查看全部
  • 为什么要在龙芯平台上编写"壁纸切换器"

              因为在Linux上没有找到好的开源软件,例如360壁纸软件、PC机上的动态壁纸软件都没有再龙芯平台上更好的兼容。所以需要编写能在龙芯平台运行的“壁纸切换器”。
  • 开发语言:为什么要使用Python?

             Python语言的优点:免费、开源、可高层语言、可移植性、解释性、面向对象、可扩展性、丰富的库、规范的代码等,由于Python的开源本质和可移植性的特点,Python已经被移植在许多平台上,这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台!所以Python程序无需修改就可以在上述任何平台上面运行!而且Python语言写的程序不需要编译成二进制代码,可以直接从源代码运行程序。
  • 程序架构


             配置文件:.wallpaper.conf 使用的是json的格式
             为什么使用json?
             JSON是一种轻量级的数据交换格式,它基于JavaScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

             读取图片文件:一是本机上存放的图片,二是络上的FTP存放的图片
              读取本机上的主要任务是,根据配置文件中图片的目录,读取该目录下的所有图片名称,再根据目录加集合里的图片名称用dconf命令更改桌面背景图片,和修改锁定屏幕的背景图片
读取FTP上的图片,首先要根据FTP上存放图片的路径,把图片读取到本机上,再根据本机上的目录,读取该目录下的所有图片名称,再根据目录加集合里的图片名称用dconf命令更改桌面背景图片,和修改锁定屏幕的背景图片。
            
             怎样更新壁纸:手动修改.wallpaper.conf配置文件后,进入终端以root用户执行  
    # python changeconfig.py
               命令,就会重新读取修改后的图片目录。

            开机后执行壁纸切换:
             向/etc/xdg/autostart/目录下,增加了wallpaper.desktop文件,那么Fedora21操作系统就会开机自启动壁纸切换。
 
            定时运行:
            根据配置文件制定的时间,利用sleep()函数来执行定时切换图片的功能。
 
            更新配置:信号机制
              在主程序中,我们首先使用signal.signal()函数来预设信号处理函数。等待信号,当信号SIGUSR1被传递给该进程时,进程从暂停中恢复,并根据预设,执行SIGTSTP的信号处理函数myHandler()。我们可以根据自己的需要更改myHandler()中的操作,以针对不同的信号实现个性化的处理。

            后台程序,自动运行  
            在打开终端后,以root用户运行wallpaper-1.0.1.sh后,可以关闭终端,进程会在后台运行,会定时切换壁纸。
  • 网址

               本项目已经开放代码
   https://github.com/renyafei-loongson/wallpaper   
 
  • 总结

            龙芯已经具有自由开发应用的能力,龙芯应用生态必将蓬勃发展。


wallpaper.png


架构图.png


pintu.png


wall.png

 

3A3000开发板上构建发布版本的ISO, 约1600个包,需要多久时间?

wanghonghu 回复了问题 • 3 人关注 • 2 个回复 • 322 次浏览 • 2017-12-12 18:55 • 来自相关话题

portainer 1.14.3 移植

admin 发表了文章 • 0 个评论 • 183 次浏览 • 2017-12-12 15:21 • 来自相关话题

版本号:portainer:1.14.3

简介:Docker 的图形化管理工具,提供状态显示面板、应用模板快速部署、容器 镜像网络数据卷的基本操作、事件日志显示、容器控制台操作、Swarm 集群和服 务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足 中小型单位对容器管理的全部需求。

官网地址:git clone -b 1.14.3 https://github.com/portainer/portainer.git 源代码(修改之前)、(修改之后):

集成到 fc21 平台的镜像导出的 tar 包下载 :loongson-portainer.tar 编译文档: 参看 http://ask.loongnix.org/?/article/90

成品二进制: 已经集成到 fc21 平台
测试报告:无
使用说明:
下载 loongson-portainer.tar 包后( 见附件),打开终端,进入这个包所在的目录下: 终端输入命令,

# cat loongson-portainer.tar | docker import - loongson-portainer

# docker run -i -t --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock loongson-portainer

打开浏览器,输入网址 http://localhost:9000
  查看全部
版本号:portainer:1.14.3

简介:Docker 的图形化管理工具,提供状态显示面板、应用模板快速部署、容器 镜像网络数据卷的基本操作、事件日志显示、容器控制台操作、Swarm 集群和服 务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足 中小型单位对容器管理的全部需求。

官网地址:git clone -b 1.14.3 https://github.com/portainer/portainer.git 源代码(修改之前)、(修改之后):

集成到 fc21 平台的镜像导出的 tar 包下载 :loongson-portainer.tar 编译文档: 参看 http://ask.loongnix.org/?/article/90

成品二进制: 已经集成到 fc21 平台
测试报告:无
使用说明:
下载 loongson-portainer.tar 包后( 见附件),打开终端,进入这个包所在的目录下: 终端输入命令,

# cat loongson-portainer.tar | docker import - loongson-portainer

# docker run -i -t --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock loongson-portainer

打开浏览器,输入网址 http://localhost:9000
 

loongson2f_龙芯灵珑9S2A一体机尝试usb和硬盘两种方式安装debian6成功

linkasm 发表了文章 • 4 个评论 • 434 次浏览 • 2017-11-21 23:18 • 来自相关话题

我的龙芯一体机的配置是:cpu:loongson 2f,内存:换成了1G(注意,亲测,换成2G的内存无法安装)
龙芯debian6系统是下载至 www.anheng.com.cn/loongson/install/lynloong_2f_9003/
的   lynloong_debian6_install.tar.gz
将下载的 lynloong_debian6_install.tar.gz 文件解压得到三个文件,分别是:

boot.cfg  ,   install_lyn  ,   lynoong_debian6_20111226.tar.lzma 

安装时分两种情况,一种是usb方式安装,另外一种是硬盘方式安装
 
详细的过程我在 我的博客  http://blog.csdn.net/v80/article/details/78595967  有详细记录,有需要的

朋友可以参考参考,如果有朋友有关于9S2A一体机的更高版本的系统安装方法,或是其它发行版系统的安装方法,请发布出来让大家都看看

  查看全部
我的龙芯一体机的配置是:cpu:loongson 2f,内存:换成了1G(注意,亲测,换成2G的内存无法安装)
龙芯debian6系统是下载至 www.anheng.com.cn/loongson/install/lynloong_2f_9003/
的   lynloong_debian6_install.tar.gz
将下载的 lynloong_debian6_install.tar.gz 文件解压得到三个文件,分别是:

boot.cfg  ,   install_lyn  ,   lynoong_debian6_20111226.tar.lzma 

安装时分两种情况,一种是usb方式安装,另外一种是硬盘方式安装
 
详细的过程我在 我的博客  http://blog.csdn.net/v80/article/details/78595967  有详细记录,有需要的

朋友可以参考参考,如果有朋友有关于9S2A一体机的更高版本的系统安装方法,或是其它发行版系统的安装方法,请发布出来让大家都看看

 

(精品)(龙芯公有云系列之一)搭建分布式存储服务etcd

renyafei 发表了文章 • 0 个评论 • 511 次浏览 • 2017-11-03 11:21 • 来自相关话题

etcd 是一个应用在分布式环境下的 key/value 存储服务。
 





 

由于Kubernetes要使用到etcd,所以第一步就是进行etcd的搭建。
 
etcd是一个Go语言编写的软件。

 搭建环境
 
本文的实验都是在龙芯3A3000机器上。
操作系统是loongnix(Fedora21)20170512版本。
GO版本:go1.7.5 linux/mips64le
 
开始搭建
 
首先打开终端,配置GOPATH# export GOPATH=/usr/lib/golang进入GOPATH目录下# cd $GOPATH在$GOPATH的src目录下创建嵌套文件夹github.com/coreos# mkdir -p $GOPATH/src/github.com/coreos进入创建的文件夹下# cd $GOPATH/src/github.com/coreos下载etcd 2.3.6版本# git clone -b v2.3.6 https://github.com/coreos/etcd.git


进入下载的etcd 文件夹下# cd etcd开始编译# ./build出现如下错误github.com/coreos/etcd/Godeps/_workspace/src/github.com/boltdb/bolt
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: undefined: maxMapSize
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: invalid array bound maxMapSize根据maxMapSize关键字找原因,使用grep "maxMapSize"  ./* -r 找出路径# grep "maxMapSize" ./* -r搜索出如下内容./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: data *[maxMapSize]byte
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if size > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if sz > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: sz = maxMapSize
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_windows.go: db.data = ((*[maxMapSize]byte)(unsafe.Pointer(addr)))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix_solaris.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))
 根据错误提示分析,是因为在 ./Godeps/_workspace/src/github.com/boltdb/bolt 文件夹下,
缺少了支持mips64le平台的文件。
进入这个目录下添加bolt_mips64le.go文件:# cd ./Godeps/_workspace/src/github.com/boltdb/bolt
# cp bolt_arm.go bolt_mips64le.go重新进入etcd文件夹下,开始编译# cd $GOPATH/src/github.com/coreos/etcd
# ./build出现如下错误2017-11-02 11:58:50.257747 E | etcdmain: etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=mips64le set.这是因为没有配置ETCD_UNSUPPORTED_ARCH环境变量
配置环境变量# export ETCD_UNSUPPORTED_ARCH=mips64le再次编译# ./build执行通过,在etcd文件夹里会生成bin文件夹,进入bin文件夹# cd bin  
把bin文件夹下的etcd、etcdctl两个文件拷贝到/usr/bin文件夹下# cp etcd /usr/bin/
# cp etcdctl /usr/bin/

 进入/usr/bin下# cd /usr/bin
 执行测试

 执行etcd文件# ./etcd2017-11-02 19:57:52.098590 W | etcdmain: running etcd on unsupported architecture "mips64le" since ETCD_UNSUPPORTED_ARCH is set
2017-11-02 19:57:52.099742 W | flags: unrecognized environment variable ETCD_UNSUPPORTED_ARCH=mips64le
2017-11-02 19:57:52.099870 I | etcdmain: etcd Version: 2.3.6
2017-11-02 19:57:52.099924 I | etcdmain: Git SHA: 128344c
2017-11-02 19:57:52.099974 I | etcdmain: Go Version: go1.7.5
2017-11-02 19:57:52.100021 I | etcdmain: Go OS/Arch: linux/mips64le
2017-11-02 19:57:52.100074 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2017-11-02 19:57:52.100145 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2017-11-02 19:57:52.101051 I | etcdmain: listening for peers on http://localhost:2380
2017-11-02 19:57:52.101273 I | etcdmain: listening for peers on http://localhost:7001
2017-11-02 19:57:52.101483 I | etcdmain: listening for client requests on http://localhost:2379
2017-11-02 19:57:52.101683 I | etcdmain: listening for client requests on http://localhost:4001
2017-11-02 19:57:52.105386 I | etcdserver: name = default
2017-11-02 19:57:52.105674 I | etcdserver: data dir = default.etcd
2017-11-02 19:57:52.105741 I | etcdserver: member dir = default.etcd/member
2017-11-02 19:57:52.105794 I | etcdserver: heartbeat = 100ms
2017-11-02 19:57:52.105845 I | etcdserver: election = 1000ms
2017-11-02 19:57:52.105896 I | etcdserver: snapshot count = 10000
2017-11-02 19:57:52.105968 I | etcdserver: advertise client URLs = http://localhost:2379,http://localhost:4001
2017-11-02 19:57:52.106025 I | etcdserver: initial advertise peer URLs = http://localhost:2380,http://localhost:7001
2017-11-02 19:57:52.106204 I | etcdserver: initial cluster = default=http://localhost:2380,default=http://localhost:7001
2017-11-02 19:57:52.115937 I | etcdserver: starting member ce2a822cea30bfca in cluster 7e27652122e8b2ae
2017-11-02 19:57:52.116104 I | raft: ce2a822cea30bfca became follower at term 0
2017-11-02 19:57:52.116172 I | raft: newRaft ce2a822cea30bfca [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2017-11-02 19:57:52.116223 I | raft: ce2a822cea30bfca became follower at term 1
2017-11-02 19:57:52.116829 I | etcdserver: starting server... [version: 2.3.6, cluster version: to_be_decided]
2017-11-02 19:57:52.118591 E | etcdmain: failed to notify systemd for readiness: No socket
2017-11-02 19:57:52.118642 E | etcdmain: forgot to set Type=notify in systemd service file?
2017-11-02 19:57:52.119456 N | etcdserver: added local member ce2a822cea30bfca [http://localhost:2380 http://localhost:7001] to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.516914 I | raft: ce2a822cea30bfca is starting a new election at term 1
2017-11-02 19:57:52.517204 I | raft: ce2a822cea30bfca became candidate at term 2
2017-11-02 19:57:52.517241 I | raft: ce2a822cea30bfca received vote from ce2a822cea30bfca at term 2
2017-11-02 19:57:52.517327 I | raft: ce2a822cea30bfca became leader at term 2
2017-11-02 19:57:52.517369 I | raft: raft.node: ce2a822cea30bfca elected leader ce2a822cea30bfca at term 2
2017-11-02 19:57:52.518315 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379 http://localhost:4001]} to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.518664 I | etcdserver: setting up the initial cluster version to 2.3
2017-11-02 19:57:52.525866 N | etcdserver: set the initial cluster version to 2.3
 再另一个终端中测试# etcdctl set /foo/bar “hello world”输出“hello world”说明启动成功。
 
这样,etcd就搭建成功了,整个过程还是很简单的,改动的代码不算多,运行也比较顺利。
 
后面将继续移植Kubernetes,好期待啊! 查看全部
etcd 是一个应用在分布式环境下的 key/value 存储服务。
 

timg.jpg

 

由于Kubernetes要使用到etcd,所以第一步就是进行etcd的搭建。
 
etcd是一个Go语言编写的软件。

 搭建环境
 
本文的实验都是在龙芯3A3000机器上。
操作系统是loongnix(Fedora21)20170512版本。
GO版本:go1.7.5 linux/mips64le
 
开始搭建
 
首先打开终端,配置GOPATH
# export GOPATH=/usr/lib/golang
进入GOPATH目录下
# cd $GOPATH
在$GOPATH的src目录下创建嵌套文件夹github.com/coreos
# mkdir -p $GOPATH/src/github.com/coreos
进入创建的文件夹下
# cd $GOPATH/src/github.com/coreos
下载etcd 2.3.6版本
# git clone  -b  v2.3.6 https://github.com/coreos/etcd.git


进入下载的etcd 文件夹下
# cd etcd
开始编译
# ./build
出现如下错误
github.com/coreos/etcd/Godeps/_workspace/src/github.com/boltdb/bolt
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: undefined: maxMapSize
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: invalid array bound maxMapSize
根据maxMapSize关键字找原因,使用grep "maxMapSize"  ./* -r 找出路径
# grep "maxMapSize" ./* -r
搜索出如下内容
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go:	data     *[maxMapSize]byte
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if size > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if sz > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: sz = maxMapSize
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_windows.go: db.data = ((*[maxMapSize]byte)(unsafe.Pointer(addr)))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix_solaris.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))

 根据错误提示分析,是因为在 ./Godeps/_workspace/src/github.com/boltdb/bolt 文件夹下,
缺少了支持mips64le平台的文件。
进入这个目录下添加bolt_mips64le.go文件:
# cd ./Godeps/_workspace/src/github.com/boltdb/bolt
# cp bolt_arm.go bolt_mips64le.go
重新进入etcd文件夹下,开始编译
# cd $GOPATH/src/github.com/coreos/etcd
# ./build
出现如下错误
2017-11-02 11:58:50.257747 E | etcdmain: etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=mips64le set.
这是因为没有配置ETCD_UNSUPPORTED_ARCH环境变量
配置环境变量
# export ETCD_UNSUPPORTED_ARCH=mips64le
再次编译
# ./build
执行通过,在etcd文件夹里会生成bin文件夹,进入bin文件夹
# cd bin 
 
把bin文件夹下的etcd、etcdctl两个文件拷贝到/usr/bin文件夹下
# cp etcd  /usr/bin/ 
# cp etcdctl /usr/bin/


 进入/usr/bin下
# cd /usr/bin

 执行测试

 执行etcd文件
# ./etcd
2017-11-02 19:57:52.098590 W | etcdmain: running etcd on unsupported architecture "mips64le" since ETCD_UNSUPPORTED_ARCH is set
2017-11-02 19:57:52.099742 W | flags: unrecognized environment variable ETCD_UNSUPPORTED_ARCH=mips64le
2017-11-02 19:57:52.099870 I | etcdmain: etcd Version: 2.3.6
2017-11-02 19:57:52.099924 I | etcdmain: Git SHA: 128344c
2017-11-02 19:57:52.099974 I | etcdmain: Go Version: go1.7.5
2017-11-02 19:57:52.100021 I | etcdmain: Go OS/Arch: linux/mips64le
2017-11-02 19:57:52.100074 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2017-11-02 19:57:52.100145 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2017-11-02 19:57:52.101051 I | etcdmain: listening for peers on http://localhost:2380
2017-11-02 19:57:52.101273 I | etcdmain: listening for peers on http://localhost:7001
2017-11-02 19:57:52.101483 I | etcdmain: listening for client requests on http://localhost:2379
2017-11-02 19:57:52.101683 I | etcdmain: listening for client requests on http://localhost:4001
2017-11-02 19:57:52.105386 I | etcdserver: name = default
2017-11-02 19:57:52.105674 I | etcdserver: data dir = default.etcd
2017-11-02 19:57:52.105741 I | etcdserver: member dir = default.etcd/member
2017-11-02 19:57:52.105794 I | etcdserver: heartbeat = 100ms
2017-11-02 19:57:52.105845 I | etcdserver: election = 1000ms
2017-11-02 19:57:52.105896 I | etcdserver: snapshot count = 10000
2017-11-02 19:57:52.105968 I | etcdserver: advertise client URLs = http://localhost:2379,http://localhost:4001
2017-11-02 19:57:52.106025 I | etcdserver: initial advertise peer URLs = http://localhost:2380,http://localhost:7001
2017-11-02 19:57:52.106204 I | etcdserver: initial cluster = default=http://localhost:2380,default=http://localhost:7001
2017-11-02 19:57:52.115937 I | etcdserver: starting member ce2a822cea30bfca in cluster 7e27652122e8b2ae
2017-11-02 19:57:52.116104 I | raft: ce2a822cea30bfca became follower at term 0
2017-11-02 19:57:52.116172 I | raft: newRaft ce2a822cea30bfca [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2017-11-02 19:57:52.116223 I | raft: ce2a822cea30bfca became follower at term 1
2017-11-02 19:57:52.116829 I | etcdserver: starting server... [version: 2.3.6, cluster version: to_be_decided]
2017-11-02 19:57:52.118591 E | etcdmain: failed to notify systemd for readiness: No socket
2017-11-02 19:57:52.118642 E | etcdmain: forgot to set Type=notify in systemd service file?
2017-11-02 19:57:52.119456 N | etcdserver: added local member ce2a822cea30bfca [http://localhost:2380 http://localhost:7001] to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.516914 I | raft: ce2a822cea30bfca is starting a new election at term 1
2017-11-02 19:57:52.517204 I | raft: ce2a822cea30bfca became candidate at term 2
2017-11-02 19:57:52.517241 I | raft: ce2a822cea30bfca received vote from ce2a822cea30bfca at term 2
2017-11-02 19:57:52.517327 I | raft: ce2a822cea30bfca became leader at term 2
2017-11-02 19:57:52.517369 I | raft: raft.node: ce2a822cea30bfca elected leader ce2a822cea30bfca at term 2
2017-11-02 19:57:52.518315 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379 http://localhost:4001]} to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.518664 I | etcdserver: setting up the initial cluster version to 2.3
2017-11-02 19:57:52.525866 N | etcdserver: set the initial cluster version to 2.3

 再另一个终端中测试
# etcdctl set /foo/bar  “hello world”
输出“hello world”说明启动成功。
 
这样,etcd就搭建成功了,整个过程还是很简单的,改动的代码不算多,运行也比较顺利。
 
后面将继续移植Kubernetes,好期待啊!

loongnix的源码和二进制包可以通过rsync同步吗?

jiang_10000 回复了问题 • 2 人关注 • 2 个回复 • 484 次浏览 • 2017-11-27 08:47 • 来自相关话题

(精品)(Docker系列之十)搭建龙芯平台Docker Swarm集群

mangoooo 发表了文章 • 2 个评论 • 757 次浏览 • 2017-10-16 17:57 • 来自相关话题

本教程将指导完成如下工作:
初始化一个Docker swarm集群;添加节点到swarm;部署swarm服务;管理swarm。
准备工作:
三台Linux系统的主机(可以是物理机、虚拟机或者docker容器,本文选择了三台龙芯3A3000+Loongnix(Fedora21-20170927));每台主机安装Docker Engine且版本为1.12及以上;其中一台主机作为管理节点,需知道其IP地址;主机彼此之间开放下面几个端口:
TCP 端口2377用于集群管理通信,TCP/UDP端口7946用于节点间通信,UDP端口4789用于overlay网络通信。
         默认情况这些端口都是开放的,如果不确定可以执行下面的命令打开这3个端

iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 4789 -j ACCEPT


初始化一个Docker swarm集群
首先确认各主机的Docker deamon已经启动:




如果服务状态不是active(running),执行命令service docker start来启动Docker deamon。
接下来就可以正式开始了。

1.选择一台主机作为管理节点(manager1),获取到主机IP为10.20.42.45。终端输入命令docker swarm init 初始化swarm。

[root@worker1 ~]# docker swarm init --advertise-addr 10.20.42.45
Swarm initialized: current node (892ozqeoeh6fugx5iao3luduk) is now a manager.
 
To add a worker to this swarm, run the following command:
 
    docker swarm join \
    --token SWMTKN-1-5vs5ndm8k5idcxeckprr61kg6a7h90dp3uihdhr3kwl1ejwtwg-58jqj86p1nqfh225t51p5h8lp \
    10.20.42.45:2377
 
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

 --advertise-addr 配置管理节点的广播地址为10.20.42.45,其他的节点要想加入集群需要能够访问该地址。
输出信息显示了其他节点分别作为管理节点和工作节点加入该集群的方法。

2.输入命令docker info查看当前状态的swarm信息,截取部分关键信息如下:

[root@worker1 ~]# docker info
Containers: 10
 Running: 0
 Paused: 0
 Stopped: 10
Images: 22
Server Version: 1.12.2
... ...
Swarm: active
 NodeID: 250tj9l3mnrrtprdd0990b2t3
 Is Manager: true
 ClusterID: atrevada8k0amn83zdiig6qkb
 Managers: 1
 Nodes: 1
 Orchestration:
  Task History Retention Limit: 5
... ...

 3.输入命令docker node ls查看节点信息:

[root@localhost loongson]# docker node ls
ID                                      HOSTNAME      STATUS    AVAILABILITY    MANAGER STATUS
250tj9l3mnrrtprdd0990b2t3 *  manager1        Ready        Active              Leader

*表示你连接到的节点ID。

添加两个节点到swarm
另外选择一台主机作为工作节点(worker1),第三台主机也作为工作节点(worker2)。

1.worker1上打开终端。上文我们在创建swarm时,输出提示信息展示了如何作为工作节点加入swarm:

[root@worker1 ~]# docker swarm join /
--token SWMTKN-1-5vs5ndm8k5idcxeckprr61kg6a7h90dp3uihdhr3kwl1ejwtwg-58jqj86p1nqfh225t51p5h8lp /
10.20.42.45:2377
This node joined a swarm as a worker.

如果你丢失了上面命令的信息,可以在manager1上执行docker swarm join-token worker重新获取。

2.worker2上重复worker1的步骤,作为工作节点加入swarm。

3.回到管理节点mgnager1,输入命令docker node ls查看swarm内所有节点状态:

[root@manager1 ~]# docker node ls
ID                                          HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
250tj9l3mnrrtprdd0990b2t3 *   manager1   Ready     Active             Leader
a24i9nu2943niy8eq239bbpwv  worker1      Ready     Active         
e0lh6c2zb57qg8db7usvg17r6    worker2     Ready     Active         

*显示本机连接到的节点,MANAGERSTATUS一栏为Leader表示该节点为管理节点,空表示为工作节点。
 
部署一个服务到swarm
为了更直观的观察集群的服务编排,我们在管理节点启动portainer,其中swarm visualizer模块能直观地看到每个节点的服务详情。
portainer 下载:

[root@manager1 ~]# docker pull jiangxinshang/portainer

启动portainer(9000端口不要被其他应用占用):

[root@manager1 ~]# docker run -t -i -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/jiangxinshang/portainer
2017/10/13 07:55:28 Starting Portainer 1.14.3 on :9000

浏览器输出127.0.0.1:9000就能看到集群图示了,下图为服务部署之前的情况:
 





1.manager1上打开终端,输入命令:

[root@manager1 ~]# docker service create  --replicas 1 --name hello 10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"
an85njt7e5dadfpwcfyr21sfs

docker service create命令是创建服务
--name 将该服务命名为hello
-- replicas 规定了该服务的期望状态为一个运行示例
参数10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"定义了服务是用镜像10.20.42.45:5000/fedora(三台主机节点上必须有同一个pull下来的镜像)创建一个容器,并在容器内执行/bin/bash -c "ping loongnix.org"。

2.执行如下命令,可以查看当前服务状态:

[root@manager1 ~]# docker service ls
ID                NAME   REPLICAS  IMAGE                                       COMMAND
an85njt7e5da  hello    1/1   10.20.42.45:5000/fedora  /bin/bash -c ping loongnix.org

3. 查看该服务信息

[root@manager1 ~]# docker service ps hello
ID                                          NAME         IMAGE            NODE     DESIRED STATE  CURRENT STATE      ERROR
cwk9d8b67n20lmglhbz7jewne  hello.1  10.20.42.45:5000/fedora  worker2  Running        Running 5 minutes ago  

当前状态是服务运行在worker2上,但也可能运行在worker1或者manager1上,因为管理节点同时作为工作节点也会运行服务。在下面的步骤中你会看到更详细的演示。
在swarm visualizer上观察当前三个节点的服务。





 

查看服务的详细信息
1.登录manager1,终端执行命令docker service inspect --pretty <SERVICE-ID>,能查看该服务可读性良好的格式化输出:

[root@manager1 ~]# docker service inspect --pretty hello
ID:        an85njt7e5dadfpwcfyr21sfs
Name:        hello
Mode:        Replicated
 Replicas:    1
Placement:
UpdateConfig:
 Parallelism:    1
 On failure:    pause
ContainerSpec:
 Image:        10.20.42.45:5000/fedora
 Args:        /bin/bash -c ping loongnix.org
Resources:

2. 如果把--pretty去掉,看到的则是json形式的格式化输出:

[root@manager1 ~]# docker service inspect hello
[
    {
        "ID": "an85njt7e5dadfpwcfyr21sfs",
        "Version": {
            "Index": 230
        },
        "CreatedAt": "2017-10-13T02:14:33.706598Z",
        "UpdatedAt": "2017-10-13T02:14:33.706598Z",
        "Spec": {
            "Name": "hello",
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "10.20.42.45:5000/fedora",
                    "Args": [
                        "/bin/bash",
                        "-c",
                        "ping",
                        "loongnix.org"
                    ]
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "MaxAttempts": 0
                },
                "Placement": {}
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 1
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause"
            },
            "EndpointSpec": {
                "Mode": "vip"
            }
        },
        "Endpoint": {
            "Spec": {}
        },
        "UpdateStatus": {
            "StartedAt": "0001-01-01T00:00:00Z",
            "CompletedAt": "0001-01-01T00:00:00Z"
        }
    }
]

 
伸缩服务
1.manager1上执行命令docker service scale <SERVICE-ID>=<NUMBER-OF-TASKA>可修改当前运行任务的个数,例如:

[root@manager1 ~]# docker service scale hello=5
hello scaled to 5

 
2. 通过命令查看当前运行任务个数,REPLICAS变为了5/5。

[root@manager1 ~]# docker service ls
ID                    NAME   REPLICAS  IMAGE                                     COMMAND
an85njt7e5da  hello    5/5    10.20.42.45:5000/fedora   /bin/bash -c ping loongnix.org

3.查看hello服务在各节点分配情况:

[root@manager1 ~]# docker service ps hello
ID                                              NAME       IMAGE                      NODE         DESIRED STATE     CURRENT STATE                   ERROR
cwk9d8b67n20lmglhbz7jewne  hello.1  10.20.42.45:5000/fedora  worker2   Running        Running 7 minutes ago            
9wyodmvvf77ucbums23ortuj0  hello.2  10.20.42.45:5000/fedora  worker1   Running        Running 41 seconds ago           
19ev4tcj0be2t1xbdkf7evp4f  hello.3  10.20.42.45:5000/fedora  manager1  Running        Running 44 seconds ago           
1tm1tc2r8xdgdry2hu0pjilmy  hello.4  10.20.42.45:5000/fedora  manager1  Running        Running less than a second ago   
cfqh34h9e6jv7l0iiwau8jhsf  hello.5  10.20.42.45:5000/fedora  worker2   Running        Running less than a second ago   

 
通过swarm visualizer查看服务直观图示:
 



swarm会负载均衡地编排服务在各节点的运行。
4. 在manager1节点上我们也可以观察到对应的两个容器信息:

[root@manager1 ~]# docker ps  
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                    NAMES
2f6be7870988        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   5 minutes ago       Up 5 minutes                                 hello.4.1tm1tc2r8xdgdry2hu0pjilmy
a2da3bb3c4f0        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   5 minutes ago       Up 5 minutes                                 hello.3.19ev4tcj0be2t1xbdkf7evp4f

 
worker1上通过命令观察到一个对应容器信息:

[root@worker1 ~]# docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS               NAMES
954af2601ac2        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   6 minutes ago       Up 6 minutes                            hello.2.9wyodmvvf77ucbums23ortuj0

worker2 略。

删除运行的服务
1.在管理节点manager1上,删除服务通过命令dockr service rm <SERVICE-ID>实现:

[root@manager1 ~]# docker service rm hello
hello

2. 管理节点再查看该服务信息会报错:

[root@manager1 ~]# docker service ps hello
Error: No such service: hello

3.工作节点查看容器也关闭了

[root@worker1 ~]# docker ps  
CONTAINER ID      IMAGE       COMMAND      CREATED      STATUS       PORTS       NAMES

 
滚动更新服务
在这个环节我们部署一个服务来创建基于fedora:21.0镜像的容器,然后演示滚动更新服务,升级镜像容器到fedora:21.1。

1.首先在manager1节点部署服务,并配置swarm的更新间隔时间为10秒:

[root@manager1 ~]# docker service create --replicas 5 --name fedora --update-delay 10s fedora:21.0 ping loongnix.org
des35b3cu097uelo8n8zv5gez

我们在部署服务时指定滚动更新策略。
--update-delay 表示更新服务的一个任务或一组任务之间的时间间隔。时间间隔用数字和单位组成,m 表示分,h 表示时,例如10m30s表示指定了10分30秒的间隔。
默认情况下,调度器一次更新一个任务。也可以通过参数 --update-parallelism 配置调度器每次同时更新的最大任务数量。
默认情况下,若更新一个任务返回了RUNNING状态,调度器会转去更新下一个,直到所有任务都更新完成;若更新一个任务返回了FAILED,调度器则暂停更新。我们可以在执行docker service create 命令或 docker service update 命令时使用 --update-failure-action 参数来指定更新返回失败之后的行为。

2. 查看集群内各节点的服务编排:




 
3.开始更新fedora镜像,swarm管理器将依据update的配置测略实施更新:

[root@manager1 ~]# docker service update --image fedora:21.1 fedora
fedora

调度器按照如下步骤实现滚动更新:
停止第一个任务为已停止的任务调度更新为已更新的任务开启容器如果一个任务的更新结果返回RUNNING,等待指定的时间间隔后开始更新下一个任务;如果更新一个任务的任意阶段返回了FAILED,中止更新任务。

4.通过portainer能看到服务的实时更新情况:
 



















 
5.输入命令docker service ps <SERVICE-ID>观察滚动更新:

[root@manager1 ~]# docker service ps fedora
ID                         NAME          IMAGE        NODE      DESIRED STATE  CURRENT STATE           ERROR
6t6p5r9ujrsq0e1kf3k0yta6n  fedora.1      fedora:21.1  worker1   Running        Running 8 minutes ago    
2vctv5ay741c7z6vlx2kqdwje   \_ fedora.1  fedora:21.0  worker2   Shutdown       Shutdown 8 minutes ago   
8vrfziykhn7ar7b7zyhxlsarr  fedora.2      fedora:21.1  manager1  Running        Running 6 minutes ago    
cy0zvhqawk1j9g0jb112sq482   \_ fedora.2  fedora:21.0  worker1   Shutdown       Shutdown 6 minutes ago   
0yojbjr1omf46qycc2c6at4b7  fedora.3      fedora:21.1  worker2   Running        Running 7 minutes ago    
cisqv46430hy7p3kj5xaefgd8   \_ fedora.3  fedora:21.0  manager1  Shutdown       Shutdown 7 minutes ago   
17ailb36wdeg4zvkl9mytoxhu  fedora.4      fedora:21.1  manager1  Running        Running 6 minutes ago    
cvpl0svmlyj1ozdb6r0eiovts   \_ fedora.4  fedora:21.0  manager1  Shutdown       Shutdown 6 minutes ago   
4lt4ax7ezyqid6ndk89ksngc5  fedora.5      fedora:21.1  worker2   Running        Running 7 minutes ago    
8sbzju1llogo7d6s9t4h0e1ia   \_ fedora.5  fedora:21.0  worker2   Shutdown       Shutdown 7 minutes ago   

 
输出显示全部任务已经更新完毕。
 
下线某个节点
在前面所有的步骤中,所有节点都是运行状态且可用性为ACTIVE。swarm管理器会向ACTIVE状态的节点分配任务,目前为止各节点都能接收任务。
有时,像计划中的维护时段,需要将一个节点可用性设置为DRAIN。DRAIN的节点不能从swarm管理器接收任务。管理器会将DRAIN节点的任务停止掉,分发给其他ACTIVE的节点。

1.开始之前,先确认集群内各节点状态都是ACTIVE:

[root@manager1 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
250tj9l3mnrrtprdd0990b2t3 *  manager1  Ready   Active        Leader
a24i9nu2943niy8eq239bbpwv    worker1   Ready   Active         
e0lh6c2zb57qg8db7usvg17r6    worker2   Ready   Active         

2.重新执行之前的服务部署,将任务个数设为3,保证每个节点都被分发有任务:

[root@manager1 ~]# docker service create --replicas 3 --name helloagain 10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"
0rxfbv9fwrs0fv06hfnp8j5je
[root@manager1 ~]# docker service ps helloagain
ID                         NAME          IMAGE                    NODE      DESIRED STATE  CURRENT STATE            ERROR
8xszceewi2dj9xhbce53rkq1a  helloagain.1  10.20.42.45:5000/fedora  worker1   Running        Preparing 6 seconds ago   
6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2  10.20.42.45:5000/fedora  worker2   Running        Running 1 seconds ago     
395a7pk7e4vby3jd1sihv0gic  helloagain.3  10.20.42.45:5000/fedora  manager1  Running        Running 5 seconds ago   

3.执行命令docker node update --availability drain <NODE-ID>将一个存在任务的节点下线:

[root@manager1 ~]# docker node update --availability drain worker1
worker1

4.查看下线节点的详细信息,其中Availability显示为Drain:

[root@manager1 ~]# docker node inspect --pretty worker1
ID:            a24i9nu2943niy8eq239bbpwv
Hostname:        worker1
Joined at:        2017-10-13 01:16:01.272489 +0000 utc
Status:
 State:            Ready
 Availability:        Drain
Platform:
 Operating System:    linux
 Architecture:        mips64
Resources:
 CPUs:            4
 Memory:        7.598 GiB
Plugins:
  Network:        bridge, host, null, overlay
  Volume:        local
Engine Version:        1.12.2

5.查看该服务当前的编排情况:

[root@manager1 ~]# docker service ps helloagain
ID                         NAME              IMAGE                    NODE      DESIRED STATE  CURRENT STATE           ERROR
e6mh01ekb4dcpnnu3yez7qqdx  helloagain.1      10.20.42.45:5000/fedora  worker2   Running        Running 4 minutes ago    
8xszceewi2dj9xhbce53rkq1a   \_ helloagain.1  10.20.42.45:5000/fedora  worker1   Shutdown       Shutdown 4 minutes ago   
6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2      10.20.42.45:5000/fedora  worker2   Running        Running 10 minutes ago   
395a7pk7e4vby3jd1sihv0gic  helloagain.3      10.20.42.45:5000/fedora  manager1  Running        Running 10 minutes ago  





worker1节点的任务已经关闭,被分发到了worker2上。

6.重新将worker1的Availability从DRAIN改回为ACTIVE,再观察:

[root@manager1 ~]# docker node update --availability active worker1
worker1
[root@manager1 ~]# docker node inspect --pretty worker1
ID:            a24i9nu2943niy8eq239bbpwv
Hostname:        worker1
Joined at:        2017-10-13 01:16:01.272489 +0000 utc
Status:
 State:            Ready
 Availability:        Active
Platform:
 Operating System:    linux
 Architecture:        mips64
Resources:
 CPUs:            4
 Memory:        7.598 GiB
Plugins:
  Network:        bridge, host, null, overlay
  Volume:        local
Engine Version:        1.12.2
[root@manager1 ~]# docker service ps helloagain
ID                         NAME              IMAGE                    NODE      DESIRED STATE  CURRENT STATE           ERROR
e6mh01ekb4dcpnnu3yez7qqdx  helloagain.1      10.20.42.45:5000/fedora  worker2   Running        Running 8 minutes ago    
8xszceewi2dj9xhbce53rkq1a   \_ helloagain.1  10.20.42.45:5000/fedora  worker1   Shutdown       Shutdown 8 minutes ago   
6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2      10.20.42.45:5000/fedora  worker2   Running        Running 13 minutes ago   
395a7pk7e4vby3jd1sihv0gic  helloagain.3      10.20.42.45:5000/fedora  manager1  Running        Running 13 minutes ago  

可以看到,worker1的Availability状态变回Active,状态为Ready。因为当前没有任务变化还暂时没有被分配任务。
一个可用性为Active的节点可以在以下情况接收新的任务:
当伸缩一个服务时当任务滚动更新时当其他某个节点被设为Drain时当某个任务在其他 Active 节点上启动失败时 查看全部
本教程将指导完成如下工作:
  1. 初始化一个Docker swarm集群;
  2. 添加节点到swarm;
  3. 部署swarm服务;
  4. 管理swarm。

准备工作:
  1. 三台Linux系统的主机(可以是物理机、虚拟机或者docker容器,本文选择了三台龙芯3A3000+Loongnix(Fedora21-20170927));
  2. 每台主机安装Docker Engine且版本为1.12及以上;
  3. 其中一台主机作为管理节点,需知道其IP地址;
  4. 主机彼此之间开放下面几个端口:

  • TCP 端口2377用于集群管理通信,
  • TCP/UDP端口7946用于节点间通信,
  • UDP端口4789用于overlay网络通信。

         默认情况这些端口都是开放的,如果不确定可以执行下面的命令打开这3个端


iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 4789 -j ACCEPT



初始化一个Docker swarm集群
首先确认各主机的Docker deamon已经启动:
Screenshot.png

如果服务状态不是active(running),执行命令service docker start来启动Docker deamon。
接下来就可以正式开始了。

1.选择一台主机作为管理节点(manager1),获取到主机IP为10.20.42.45。终端输入命令docker swarm init 初始化swarm。


[root@worker1 ~]# docker swarm init --advertise-addr 10.20.42.45
Swarm initialized: current node (892ozqeoeh6fugx5iao3luduk) is now a manager.
 
To add a worker to this swarm, run the following command:
 
    docker swarm join \
    --token SWMTKN-1-5vs5ndm8k5idcxeckprr61kg6a7h90dp3uihdhr3kwl1ejwtwg-58jqj86p1nqfh225t51p5h8lp \
    10.20.42.45:2377
 
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.


 --advertise-addr 配置管理节点的广播地址为10.20.42.45,其他的节点要想加入集群需要能够访问该地址。
输出信息显示了其他节点分别作为管理节点和工作节点加入该集群的方法。

2.输入命令docker info查看当前状态的swarm信息,截取部分关键信息如下:


[root@worker1 ~]# docker info
Containers: 10
 Running: 0
 Paused: 0
 Stopped: 10
Images: 22
Server Version: 1.12.2
... ...
Swarm: active
 NodeID: 250tj9l3mnrrtprdd0990b2t3
 Is Manager: true
 ClusterID: atrevada8k0amn83zdiig6qkb
 Managers: 1
 Nodes: 1
 Orchestration:
  Task History Retention Limit: 5
... ...


 3.输入命令docker node ls查看节点信息:


[root@localhost loongson]# docker node ls
ID                                      HOSTNAME      STATUS    AVAILABILITY    MANAGER STATUS
250tj9l3mnrrtprdd0990b2t3 *  manager1        Ready        Active              Leader


*表示你连接到的节点ID。

添加两个节点到swarm
另外选择一台主机作为工作节点(worker1),第三台主机也作为工作节点(worker2)。

1.worker1上打开终端。上文我们在创建swarm时,输出提示信息展示了如何作为工作节点加入swarm:


[root@worker1 ~]# docker swarm join /
--token SWMTKN-1-5vs5ndm8k5idcxeckprr61kg6a7h90dp3uihdhr3kwl1ejwtwg-58jqj86p1nqfh225t51p5h8lp /
10.20.42.45:2377
This node joined a swarm as a worker.


如果你丢失了上面命令的信息,可以在manager1上执行docker swarm join-token worker重新获取。

2.worker2上重复worker1的步骤,作为工作节点加入swarm。

3.回到管理节点mgnager1,输入命令docker node ls查看swarm内所有节点状态:


[root@manager1 ~]# docker node ls
ID                                          HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
250tj9l3mnrrtprdd0990b2t3 *   manager1   Ready     Active             Leader
a24i9nu2943niy8eq239bbpwv  worker1      Ready     Active         
e0lh6c2zb57qg8db7usvg17r6    worker2     Ready     Active         


*显示本机连接到的节点,MANAGERSTATUS一栏为Leader表示该节点为管理节点,空表示为工作节点。
 
部署一个服务到swarm
为了更直观的观察集群的服务编排,我们在管理节点启动portainer,其中swarm visualizer模块能直观地看到每个节点的服务详情。
portainer 下载:


[root@manager1 ~]# docker pull jiangxinshang/portainer


启动portainer(9000端口不要被其他应用占用):


[root@manager1 ~]# docker run -t -i -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/jiangxinshang/portainer
2017/10/13 07:55:28 Starting Portainer 1.14.3 on :9000


浏览器输出127.0.0.1:9000就能看到集群图示了,下图为服务部署之前的情况:
 
Screenshot-Portainer_-_Mozilla_Firefox.png


1.manager1上打开终端,输入命令:


[root@manager1 ~]# docker service create  --replicas 1 --name hello 10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"
an85njt7e5dadfpwcfyr21sfs


docker service create命令是创建服务
--name 将该服务命名为hello
-- replicas 规定了该服务的期望状态为一个运行示例
参数10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"定义了服务是用镜像10.20.42.45:5000/fedora(三台主机节点上必须有同一个pull下来的镜像)创建一个容器,并在容器内执行/bin/bash -c "ping loongnix.org"。

2.执行如下命令,可以查看当前服务状态:


[root@manager1 ~]# docker service ls
ID                NAME   REPLICAS  IMAGE                                       COMMAND
an85njt7e5da  hello    1/1   10.20.42.45:5000/fedora  /bin/bash -c ping loongnix.org


3. 查看该服务信息


[root@manager1 ~]# docker service ps hello
ID                                          NAME         IMAGE            NODE     DESIRED STATE  CURRENT STATE      ERROR
cwk9d8b67n20lmglhbz7jewne  hello.1  10.20.42.45:5000/fedora  worker2  Running        Running 5 minutes ago  


当前状态是服务运行在worker2上,但也可能运行在worker1或者manager1上,因为管理节点同时作为工作节点也会运行服务。在下面的步骤中你会看到更详细的演示。
在swarm visualizer上观察当前三个节点的服务。

Screenshot-Portainer_-_Mozilla_Firefox-6.png

 

查看服务的详细信息
1.登录manager1,终端执行命令docker service inspect --pretty <SERVICE-ID>,能查看该服务可读性良好的格式化输出:


[root@manager1 ~]# docker service inspect --pretty hello
ID:        an85njt7e5dadfpwcfyr21sfs
Name:        hello
Mode:        Replicated
 Replicas:    1
Placement:
UpdateConfig:
 Parallelism:    1
 On failure:    pause
ContainerSpec:
 Image:        10.20.42.45:5000/fedora
 Args:        /bin/bash -c ping loongnix.org
Resources:


2. 如果把--pretty去掉,看到的则是json形式的格式化输出:


[root@manager1 ~]# docker service inspect hello
[
    {
        "ID": "an85njt7e5dadfpwcfyr21sfs",
        "Version": {
            "Index": 230
        },
        "CreatedAt": "2017-10-13T02:14:33.706598Z",
        "UpdatedAt": "2017-10-13T02:14:33.706598Z",
        "Spec": {
            "Name": "hello",
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "10.20.42.45:5000/fedora",
                    "Args": [
                        "/bin/bash",
                        "-c",
                        "ping",
                        "loongnix.org"
                    ]
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "MaxAttempts": 0
                },
                "Placement": {}
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 1
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause"
            },
            "EndpointSpec": {
                "Mode": "vip"
            }
        },
        "Endpoint": {
            "Spec": {}
        },
        "UpdateStatus": {
            "StartedAt": "0001-01-01T00:00:00Z",
            "CompletedAt": "0001-01-01T00:00:00Z"
        }
    }
]


 
伸缩服务
1.manager1上执行命令docker service scale <SERVICE-ID>=<NUMBER-OF-TASKA>可修改当前运行任务的个数,例如:


[root@manager1 ~]# docker service scale hello=5
hello scaled to 5


 
2. 通过命令查看当前运行任务个数,REPLICAS变为了5/5。


[root@manager1 ~]# docker service ls
ID                    NAME   REPLICAS  IMAGE                                     COMMAND
an85njt7e5da  hello    5/5    10.20.42.45:5000/fedora   /bin/bash -c ping loongnix.org


3.查看hello服务在各节点分配情况:


[root@manager1 ~]# docker service ps hello
ID                                              NAME       IMAGE                      NODE         DESIRED STATE     CURRENT STATE                   ERROR
cwk9d8b67n20lmglhbz7jewne  hello.1  10.20.42.45:5000/fedora  worker2   Running        Running 7 minutes ago            
9wyodmvvf77ucbums23ortuj0  hello.2  10.20.42.45:5000/fedora  worker1   Running        Running 41 seconds ago           
19ev4tcj0be2t1xbdkf7evp4f  hello.3  10.20.42.45:5000/fedora  manager1  Running        Running 44 seconds ago           
1tm1tc2r8xdgdry2hu0pjilmy  hello.4  10.20.42.45:5000/fedora  manager1  Running        Running less than a second ago   
cfqh34h9e6jv7l0iiwau8jhsf  hello.5  10.20.42.45:5000/fedora  worker2   Running        Running less than a second ago   


 
通过swarm visualizer查看服务直观图示:
 
Screenshot-Portainer_-_Mozilla_Firefox-8.png

swarm会负载均衡地编排服务在各节点的运行。
4. 在manager1节点上我们也可以观察到对应的两个容器信息:


[root@manager1 ~]# docker ps  
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                    NAMES
2f6be7870988        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   5 minutes ago       Up 5 minutes                                 hello.4.1tm1tc2r8xdgdry2hu0pjilmy
a2da3bb3c4f0        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   5 minutes ago       Up 5 minutes                                 hello.3.19ev4tcj0be2t1xbdkf7evp4f


 
worker1上通过命令观察到一个对应容器信息:


[root@worker1 ~]# docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS               NAMES
954af2601ac2        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   6 minutes ago       Up 6 minutes                            hello.2.9wyodmvvf77ucbums23ortuj0


worker2 略。

删除运行的服务
1.在管理节点manager1上,删除服务通过命令dockr service rm <SERVICE-ID>实现:


[root@manager1 ~]# docker service rm hello
hello


2. 管理节点再查看该服务信息会报错:


[root@manager1 ~]# docker service ps hello
Error: No such service: hello


3.工作节点查看容器也关闭了


[root@worker1 ~]# docker ps  
CONTAINER ID      IMAGE       COMMAND      CREATED      STATUS       PORTS       NAMES


 
滚动更新服务
在这个环节我们部署一个服务来创建基于fedora:21.0镜像的容器,然后演示滚动更新服务,升级镜像容器到fedora:21.1。

1.首先在manager1节点部署服务,并配置swarm的更新间隔时间为10秒:


[root@manager1 ~]# docker service create --replicas 5 --name fedora --update-delay 10s fedora:21.0 ping loongnix.org
des35b3cu097uelo8n8zv5gez


我们在部署服务时指定滚动更新策略。
--update-delay 表示更新服务的一个任务或一组任务之间的时间间隔。时间间隔用数字和单位组成,m 表示分,h 表示时,例如10m30s表示指定了10分30秒的间隔。
默认情况下,调度器一次更新一个任务。也可以通过参数 --update-parallelism 配置调度器每次同时更新的最大任务数量。
默认情况下,若更新一个任务返回了RUNNING状态,调度器会转去更新下一个,直到所有任务都更新完成;若更新一个任务返回了FAILED,调度器则暂停更新。我们可以在执行docker service create 命令或 docker service update 命令时使用 --update-failure-action 参数来指定更新返回失败之后的行为。

2. 查看集群内各节点的服务编排:
Screenshot-5.png

 
3.开始更新fedora镜像,swarm管理器将依据update的配置测略实施更新:


[root@manager1 ~]# docker service update --image fedora:21.1 fedora
fedora


调度器按照如下步骤实现滚动更新:
  • 停止第一个任务
  • 为已停止的任务调度更新
  • 为已更新的任务开启容器
  • 如果一个任务的更新结果返回RUNNING,等待指定的时间间隔后开始更新下一个任务;如果更新一个任务的任意阶段返回了FAILED,中止更新任务。


4.通过portainer能看到服务的实时更新情况:
 
Screenshot-6.png

Screenshot-7.png

Screenshot-8.png

Screenshot-9.png

Screenshot-10.png

 
5.输入命令docker service ps <SERVICE-ID>观察滚动更新:


[root@manager1 ~]# docker service ps fedora
ID                         NAME          IMAGE        NODE      DESIRED STATE  CURRENT STATE           ERROR
6t6p5r9ujrsq0e1kf3k0yta6n  fedora.1      fedora:21.1  worker1   Running        Running 8 minutes ago    
2vctv5ay741c7z6vlx2kqdwje   \_ fedora.1  fedora:21.0  worker2   Shutdown       Shutdown 8 minutes ago   
8vrfziykhn7ar7b7zyhxlsarr  fedora.2      fedora:21.1  manager1  Running        Running 6 minutes ago    
cy0zvhqawk1j9g0jb112sq482   \_ fedora.2  fedora:21.0  worker1   Shutdown       Shutdown 6 minutes ago   
0yojbjr1omf46qycc2c6at4b7  fedora.3      fedora:21.1  worker2   Running        Running 7 minutes ago    
cisqv46430hy7p3kj5xaefgd8   \_ fedora.3  fedora:21.0  manager1  Shutdown       Shutdown 7 minutes ago   
17ailb36wdeg4zvkl9mytoxhu  fedora.4      fedora:21.1  manager1  Running        Running 6 minutes ago    
cvpl0svmlyj1ozdb6r0eiovts   \_ fedora.4  fedora:21.0  manager1  Shutdown       Shutdown 6 minutes ago   
4lt4ax7ezyqid6ndk89ksngc5  fedora.5      fedora:21.1  worker2   Running        Running 7 minutes ago    
8sbzju1llogo7d6s9t4h0e1ia   \_ fedora.5  fedora:21.0  worker2   Shutdown       Shutdown 7 minutes ago   


 
输出显示全部任务已经更新完毕。
 
下线某个节点
在前面所有的步骤中,所有节点都是运行状态且可用性为ACTIVE。swarm管理器会向ACTIVE状态的节点分配任务,目前为止各节点都能接收任务。
有时,像计划中的维护时段,需要将一个节点可用性设置为DRAIN。DRAIN的节点不能从swarm管理器接收任务。管理器会将DRAIN节点的任务停止掉,分发给其他ACTIVE的节点。

1.开始之前,先确认集群内各节点状态都是ACTIVE:


[root@manager1 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
250tj9l3mnrrtprdd0990b2t3 *  manager1  Ready   Active        Leader
a24i9nu2943niy8eq239bbpwv    worker1   Ready   Active         
e0lh6c2zb57qg8db7usvg17r6    worker2   Ready   Active         


2.重新执行之前的服务部署,将任务个数设为3,保证每个节点都被分发有任务:


[root@manager1 ~]# docker service create --replicas 3 --name helloagain 10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"
0rxfbv9fwrs0fv06hfnp8j5je
[root@manager1 ~]# docker service ps helloagain
ID                         NAME          IMAGE                    NODE      DESIRED STATE  CURRENT STATE            ERROR
8xszceewi2dj9xhbce53rkq1a  helloagain.1  10.20.42.45:5000/fedora  worker1   Running        Preparing 6 seconds ago   
6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2  10.20.42.45:5000/fedora  worker2   Running        Running 1 seconds ago     
395a7pk7e4vby3jd1sihv0gic  helloagain.3  10.20.42.45:5000/fedora  manager1  Running        Running 5 seconds ago   


3.执行命令docker node update --availability drain <NODE-ID>将一个存在任务的节点下线:


[root@manager1 ~]# docker node update --availability drain worker1
worker1


4.查看下线节点的详细信息,其中Availability显示为Drain:


[root@manager1 ~]# docker node inspect --pretty worker1
ID:            a24i9nu2943niy8eq239bbpwv
Hostname:        worker1
Joined at:        2017-10-13 01:16:01.272489 +0000 utc
Status:
 State:            Ready
 Availability:        Drain
Platform:
 Operating System:    linux
 Architecture:        mips64
Resources:
 CPUs:            4
 Memory:        7.598 GiB
Plugins:
  Network:        bridge, host, null, overlay
  Volume:        local
Engine Version:        1.12.2


5.查看该服务当前的编排情况:


[root@manager1 ~]# docker service ps helloagain
ID                         NAME              IMAGE                    NODE      DESIRED STATE  CURRENT STATE           ERROR
e6mh01ekb4dcpnnu3yez7qqdx  helloagain.1      10.20.42.45:5000/fedora  worker2   Running        Running 4 minutes ago    
8xszceewi2dj9xhbce53rkq1a   \_ helloagain.1  10.20.42.45:5000/fedora  worker1   Shutdown       Shutdown 4 minutes ago   
6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2      10.20.42.45:5000/fedora  worker2   Running        Running 10 minutes ago   
395a7pk7e4vby3jd1sihv0gic  helloagain.3      10.20.42.45:5000/fedora  manager1  Running        Running 10 minutes ago  


Screenshot-Portainer_-_Mozilla_Firefox-9.png

worker1节点的任务已经关闭,被分发到了worker2上。

6.重新将worker1的Availability从DRAIN改回为ACTIVE,再观察:


[root@manager1 ~]# docker node update --availability active worker1
worker1
[root@manager1 ~]# docker node inspect --pretty worker1
ID:            a24i9nu2943niy8eq239bbpwv
Hostname:        worker1
Joined at:        2017-10-13 01:16:01.272489 +0000 utc
Status:
 State:            Ready
 Availability:        Active
Platform:
 Operating System:    linux
 Architecture:        mips64
Resources:
 CPUs:            4
 Memory:        7.598 GiB
Plugins:
  Network:        bridge, host, null, overlay
  Volume:        local
Engine Version:        1.12.2
[root@manager1 ~]# docker service ps helloagain
ID                         NAME              IMAGE                    NODE      DESIRED STATE  CURRENT STATE           ERROR
e6mh01ekb4dcpnnu3yez7qqdx  helloagain.1      10.20.42.45:5000/fedora  worker2   Running        Running 8 minutes ago    
8xszceewi2dj9xhbce53rkq1a   \_ helloagain.1  10.20.42.45:5000/fedora  worker1   Shutdown       Shutdown 8 minutes ago   
6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2      10.20.42.45:5000/fedora  worker2   Running        Running 13 minutes ago   
395a7pk7e4vby3jd1sihv0gic  helloagain.3      10.20.42.45:5000/fedora  manager1  Running        Running 13 minutes ago  


可以看到,worker1的Availability状态变回Active,状态为Ready。因为当前没有任务变化还暂时没有被分配任务。
一个可用性为Active的节点可以在以下情况接收新的任务:
  • 当伸缩一个服务时
  • 当任务滚动更新时
  • 当其他某个节点被设为Drain时
  • 当某个任务在其他 Active 节点上启动失败时