kubernetes 与swarm 比较
优点
- 复制集与健康维护
- 服务自发现与负载均衡
- 灰度升级
- 垃圾回收 自动回收失效镜像与容器
- 与容器引擎解耦 不仅仅支持docker容器
- 用户认证与资源隔离
缺点
大而全意味着 复杂度较高 从部署到使用都比swarm 复杂的多 相对而已swarm比较轻量级 而且跟docker引擎配合的更好 从精神上我是更支持swarm 奈何现在功能太欠缺 几天前发布了一个 SwarmKit的管理功能 功能多了不少 待其完善以后可以重回swarm的怀抱
k8s 安装过程
测试环境 阿里云 ubuntu 14.04
自动方式
会自动下载安装文件到各个集群并配置
直接看官方文档就行了写的很清楚
要先设置好ssh免密码登录
注意自动下载的地址都是需要翻墙的 可以改一下脚本文件里的地址
http://kubernetes.io/docs/getting-started-guides/ubuntu/
Docker容器方式安装
还在研究阶段官方支持不好有很多问题 容器跟平台无关方便升级 以后的版本可能会更好的支持
手动方式
为了了解一下Kube的几个组件 我们这里重点介绍一下手动安装的方式
安装节点
安装 NODE1 NODE2 2个不同主机节点 下文命令中替换为相应ip地址
1.下载安装包 etcd-v2.3.3 flannd-v0.5.5 kubenetes-v1.2.3
解压并复制采用命令到 /usr/bin 方便操作
作用解析 etcd 为k8s提供存储功能和强一致性保证 flannd 打通容器间网络可实现容器跨主机互连
2.启动etcd
node1
etcd -name k8s-etcd0 -initial-advertise-peer-urls http://NODE1:2380 -listen-peer-urls http://NODE1:2380 \
-listen-client-urls http://NODE1:2379,http://127.0.0.1:2379 -advertise-client-urls http://NODE1:2379 \
-discovery https://discovery.etcd.io/8a5ff5c9ca76877c2efd7ba3c589a110 --data-dir /mnt/k8s/flanneldata
node2
etcd -name k8s-etcd1 -initial-advertise-peer-urls http://NODE2:2380 -listen-peer-urls http://NODE2:2380 \
-listen-client-urls http://NODE2:2379,http://127.0.0.1:2379 -advertise-client-urls http://NODE2:2379 \
-discovery https://discovery.etcd.io/8a5ff5c9ca76877c2efd7ba3c589a110 --data-dir /mnt/k8s/flanneldata
etcd 也可以用docker 容器启动更方便一点
然后设置一下打通的内网网段范围
etcdctl set /coreos.com/network/config '{ "Network": "172.17.0.0/16" }'
3.启动flannel
setsid flanneld >> /mnt/k8s/logs/flanneld.log 2>&1
mk-docker-opts.sh -i
source /run/flannel/subnet.env
rm /var/run/docker.pid
ifconfig docker0 ${FLANNEL_SUBNET}
重启Docker
service docker restart
4.启动 k8s master
以一台主机为master
setsid ./kube-apiserver --address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range='192.168.0.0/16' --log_dir=/mnt/k8s/logs/kube --kubelet_port=10250 --v=0 --logtostderr=false --etcd_servers=http://NODE1:2379 --allow_privileged=false >> /mnt/k8s/logs/kube-apiserver.log 2>&1
setsid ./kube-controller-manager --v=0 --logtostderr=false --log_dir=/mnt/k8s/logs/kube --master=127.0.0.1:8080 >> /mnt/k8s/logs/kube-controller-manager 2>&1
setsid ./kube-scheduler --master='127.0.0.1:8080' --v=0 --log_dir=/mnt/k8s/logs/kube >> /mnt/k8s/logs/kube-scheduler.log 2>&1
5.启动 k8s 子节点
node 1
setsid ./kube-proxy --logtostderr=false --v=0 --master=http://NODE1:8080 >> /mnt/k8s/logs/kube-proxy.log 2>&1
setsid ./kubelet --logtostderr=false --v=0 --allow-privileged=false --log_dir=/mnt/k8s/logs/kube --address=0.0.0.0 --port=10250 --hostname_override=NODE1 --api_servers=http://NODE1:8080 >> /mnt/k8s/logs/kube-kubelet.log 2>&1 &
node 2
setsid ./kube-proxy --logtostderr=false --v=0 --master=http://NODE1:8080 >> /mnt/k8s/logs/kube-proxy.log 2>&1
setsid ./kubelet --logtostderr=false --v=0 --allow-privileged=false --log_dir=/mnt/k8s/logs/kube --address=0.0.0.0 --port=10250 --hostname_override=121.40.84.254 --api_servers=http://NODE1:8080 >> /mnt/k8s/logs/kube-kubelet.log 2>&1 &
测试一下
kubectl run my-nginx --image=nginx --replicas=2 --port=800 --expose --service-overrides='{ "spec": { "type": "NodePort" } }'
kubectl get po //查看是否正常启动
**坑 **
pause gcr.io 被墙
image pull failed for gcr.io/google_containers/pause:2.0
使用docker hub的镜像代替
docker pull kubernetes/pause docker tag kubernetes/pause gcr.io/google_containers/pause:2.0
K8s 核心概念简介
pod
k8s 中创建的最小部署单元就是pod 而容器是运行在pod里面的 pod可以运行多个容器 pod内的容器可以共享网络和存储相互访问
**replication controller **
复杂集控制器 对多个pod创建相同的副本运行在不同节点 一般不会创建单独的pod而是与rc配合创建 rc控制并管理pod的生命周期维护pod的健康
service
每个容器重新运行后的ip地址都不是固定的 所以要有一个服务方向和负载均衡来处理 service就可以实现这个需求 service创建后可以暴露一个固定的端口 与相应的pod 进行绑定
K8s 核心组件简介
apiserver
提供对外的REST API服务 运行在 master节点 对指令进行验证后 修改etcd的存储数据
shcheduler
调度器运行在master节点 通过apiserver 定时监控数据变化 运行pod时通过自身调度算法选出可运行的节点
controller-manager
控制管理器运行在master节点 分别几大管理器定时运行 分别为 1)replication controller 管理器 管理并保存所有的rc的的状态 2)service Endpoint 管理器 对service 绑定的pod 进行实时更新操作 对状态失败的pod进行解绑
3)Node controller 管理器 定时对集群的节点健康检查与监控
4)资源配额管理器 追踪集群资源使用情况
kuctrl (子节点)
管理维护当前子节点的所有容器 如同步创建新容器 回收镜像垃圾等
kube-proxy (子节点)
对客户端请求进行负载均衡并分配到service后端的pod 是service的具体实现保证了ip的动态变化 proxy 通过修改iptable 实现路由转发
工作流程
DNS 插件安装
使用ip地址方式不太容易记忆 集群内可以使用dns绑定ip并自动更新维护
安装方式很简单 调用一下脚本就可以了
cd cluster/ubuntu
KUBERNETES_PROVIDER=ubuntu ./deployAddons.sh
问题是镜像地址会被墙 需要修改一下脚本镜像地址
实践一下
下面我们来实践一下 写个helloworld 运行一下
步骤为编写yaml文件–》》编写自动部署jenkins脚本 –》》push git仓库自动部署
首先要部署docker-jenkins 环境还没有部署的可以参考我上篇blog -》这里
首先创建一个docker-hello-world-rc.yaml 一个rc和 pod
apiVersion: v1
kind: ReplicationController
metadata:
name: test-rc
spec:
replicas: 2
selector:
name: test
version: VERSION
template:
metadata:
labels:
name: test
version: VERSION
spec:
containers:
- name: test
image: IMAGE
env:
- name: "JAVA_OPTS"
value: "-Duser.timezone=GMT+8"
ports:
- containerPort: 8080
再创建 docker-hello-world-svc.yaml 对外暴露服务
apiVersion: v1
kind: Service
metadata:
name: test-svc
spec:
ports:
- port: 20000
targetPort: 8080
protocol: TCP
type: NodePort
selector:
name: test
在编写一下jenkins 的脚本
#!/bin/bash
#build in jenkins
REG_URL= xx 你的docker 仓库 地址
KUBE_MASTER= xx k8s master api service 地址
RC_FILE=$WORKSPACE/$JOB_NAME-rc.yaml
SVC_FILE=$WORKSPACE/$JOB_NAME-svc.yaml
TAG=$REG_URL/$JOB_NAME:`date +%y%m%d-%H-%M`
docker run --rm --name mvn -v /mnt/maven:/root/.m2 \
-v /mnt/jenkins_home/workspace/$JOB_NAME:/usr/src/mvn -w /usr/src/mvn/ \
maven:3.3.3-jdk-8 mvn clean install -Dmaven.test.skip=true
if [ $? -eq 0 ]; then
echo "maven install succ"
else
echo "maven install fail exit"
exit 1
fi
docker build -t $TAG $WORKSPACE/.
docker push $TAG
docker rmi $TAG
function kube(){
sed -i "s%IMAGE%$TAG%g" $RC_FILE
sed -i "s%VERSION%$VERSION%g" $RC_FILE
KUBEDNS=`eval "kubectl -s $KUBE_MASTER get svc | grep $JOB_NAME-svc | cat"`
if [ ! "$KUBEDNS" ]; then
echo "create rc and svc "
kubectl -s $KUBE_MASTER create -f $RC_FILE
kubectl -s $KUBE_MASTER create -f $SVC_FILE
else
echo "start rolling-update"
#一般只更新镜像
kubectl -s $KUBE_MASTER rolling-update $JOB_NAME-rc --image=$TAG
fi
}
kube
然后新建个java maven 工程写个hello world 页面就行了
最后push 到git仓库 等待以后就完事了
然后我们看看 创建成功后的 service 分配的端口号
kubectl describe svc 查看分配的Nodeport
然后随便找个Node节点ip:Nodeport 就可以访问了就是怎么简单
代码地址 kube-hello-world分支
下回预告 使用 swarmKit构建Docker集群 重回swarm的怀抱 不过按照现在的发展速度至少是一年以后的事啦 且听下回分解文章来源:https://www.toymoban.com/news/detail-827805.html
原文地址:https://my.oschina.net/jayqqaa12/blog/693919文章来源地址https://www.toymoban.com/news/detail-827805.html
到了这里,关于从swarm到kubernetes Docker容器云实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!