Fork me on GitHub
Suzf  Blog

Archive Linux

How-to setup Kubernetes to manage Docker Cluster on CentOS7

环境介绍
操作系统: CentOS Linux release 7.3.1611 (Core)
Kubernetes 版本: 1.5.2
Etcd 版本: 3.2.7
Docker 版本: 1.12.6
Flannel 版本: 0.7.1
主机信息

Role       service                               Hostname               IP Address
Master     kube-APIServer kubelet proxy etcd     k8s-master.suzf.net    172.16.9.50
Node1      kubelet proxy flannel docker          k8s-node1.suzf.net     172.16.9.60
Node2      kubelet proxy flannel docker          k8s-node2.suzf.net     172.16.9.70

准备工作
关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭selinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0


Master 安装与配置

Etcd 安装与配置

yum install etcd -y
PS: 本文并没有搭建etcd集群,如果需要参见官方搭建etcd集群的指导教程
yum安装的etcd默认配置文件在/etc/etcd/etcd.conf。
编辑配置文件

# grep -v ^# /etc/etcd/etcd.conf
ETCD_NAME=k8s
ETCD_DATA_DIR="/var/lib/etcd/k8s.etcd"
ETCD_LISTEN_PEER_URLS="http://172.16.9.50:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.16.9.50:4001,http://localhost:4001"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.9.50:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://172.16.9.50:4001"

启动 etcd 服务

# systemctl start  etcd.service

查看健康状态

# etcdctl cluster-health
member 9026e369ffe8e114 is healthy: got healthy result from http://172.16.9.50:4001
cluster is healthy

查看成员列表

# etcdctl member list
9026e369ffe8e114: name=k8s peerURLs=http://172.16.9.50:2380 clientURLs=http://172.16.9.50:4001 isLeader=true

Kube Master 安装与配置

yum install kubernetes -y

修改Master节点kubernetes的全局配置文件 /etc/kubernetes/config

# grep -v '^#\|^$' /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=2"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://127.0.0.1:8080"

修改Master节点kubernetes apiserver的配置文件 /etc/kubernetes/apiserver

# grep -v '^#\|^$' /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=2"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://127.0.0.1:8080"
[root@monkey ~]# grep -v '^#\|^$' /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
KUBE_ETCD_SERVERS="--etcd-servers=http://172.16.9.50:4001"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=192.168.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

启动Master节点的相关服务:etcd、kube-apiserver、kube-scheduler、kube-controller-manager,并将这些服务设为开机自动启动。

for SRV in etcd kube-apiserver kube-scheduler kube-controller-manager;
do
    sudo systemctl start ${SRV}
    sudo systemctl enable ${SRV}
    sudo systemctl status ${SRV}
done

在Master节点修改etcd的配置,设定Node中flannel所使用的子网范围为192.168.1.0 ~ 192.168.60.0(每一个Node节点都有一个独立的flannel子网)。

# etcdctl mk /suzf.net/network/config '{"Network":"192.168.0.0/16", "SubnetMin": "192.168.1.0", "SubnetMax": "192.168.60.0"}'
{"Network":"192.168.0.0/16", "SubnetMin": "192.168.1.0", "SubnetMax": "192.168.60.0"}

Node 安装与配置

yum install kubernetes-node docker flannel -y

修改Node上flannel的配置/etc/sysconfig/flanneld,设定etcd的相关信息,其中172.16.9.50 为master的IP地址。

Flannel 网络配置

# grep -v '^#\|^$'  /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://172.16.9.50:4001"
FLANNEL_ETCD_PREFIX="/suzf.net/network"

Kube node 配置

# grep -v '^#\|^$'  /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://172.16.9.50:8080"


# grep -v '^#\|^$' /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME=""
KUBELET_API_SERVER="--api-servers=http://172.16.9.50:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

在Node上启动相关服务:flanneld、docker、kube-proxy、kubelet,并将这些服务设为开机自启动

for SRV in flanneld docker kube-proxy kubelet;
do
    sudo systemctl start ${SRV}
    sudo systemctl enable ${SRV}
    sudo systemctl status ${SRV}
done

在Master节点查看k8s集群状态

# kubectl get nodes -o wide
NAME             STATUS     AGE       EXTERNAL-IP
horse.suzf.net   Ready      6d        <none>
zebra            Ready      7m        <none>

查看flannel子网分配情况

# etcdctl ls /suzf.net/network/subnets
/suzf.net/network/subnets/192.168.53.0-24
/suzf.net/network/subnets/192.168.42.0-24

在Node节点通过ip a查看flannel和docker网桥的网络配置信息,确认是否与etcd中/coreos.com/network/subnets的信息一致。

How-to setup Kubernetes to manage Docker Cluster on ubuntu

什么是 Kubernetes

Kubernetes 是来自 Google 云平台的开源容器集群管理系统。基于 Docker 构建一个容器的调度服务。该系统可以自动在一个容器集群中选择一个工作容器供使用。其核心概念是 Container Pod。详细的设计思路请参考这里。 关于 Kubernetes 系统架构及组件介绍见 这里。 本文通过实际操作来演示Kubernetes的使用,主要包括如下内容:

  • 部署环境介绍,以及Kubernetes集群逻辑架构
  • 安装部署Open vSwitch跨机器容器通信工具
  • 安装部署Etcd和Kubernetes的各大组件
  • 演示Kubernetes管理容器和服务

开源容器集群管理系统Kubernetes架构及组件介绍

本文来源于Infoq的一篇文章(见参考部分),并在难懂的地方自己理解的基础上做了修改。实际在ubuntu上部署 kubernetes 操作另见 文章
Together we will ensure that Kubernetes is a strong and open container management framework for any application and in any environment, whether in a private, public or hybrid cloud. --Urs Hölzle, Google
Kubernetes 作为Docker生态圈中重要一员,是Google多年大规模容器管理技术的开源版本,是产线实践经验的最佳表现。如Urs Hölzle所说,无论是公有云还是私有云甚至混合云,Kubernetes将作为一个为任何应用,任何环境的容器管理框架无处不在。正因为如此,目前受 到各大巨头及初创公司的青睐,如Microsoft、VMWare、Red Hat、CoreOS、Mesos等,纷纷加入给Kubernetes贡献代码。随着Kubernetes社区及各大厂商的不断改进、发 展,Kuberentes将成为容器管理领域的领导者。 接下来我们一起探索Kubernetes是什么、能做什么以及怎么做。

Monitor DRBD status

You can monitor the DRBD status by using one of two methods:

  • service drbd status
  • cat /proc/drbd

Sample output of the commands follows. These examples assume that you are running the commands on the primary (active) IBM® Netezza® host. If you run them from the standby host, the output shows the secondary status first, then the primary.

Mysql Warning Can't create test file xxx.lower-test

在 Ubuntu 中 使用 apt-get  安装的Mysql. 打算换一下 数据目录,初始化数据的时候却遇到下面错误。数据目录可读可写, mysql 配置文件也已经更新。初始化数据综总是失败。
# cat /etc/mysql/my.cnf | grep datadir
#datadir        = /var/lib/mysql
datadir        = /data/mysql-drbd
# ll /data/| grep mysql
drwxr-xr-x  5 mysql mysql 4096 Jun 28 16:05 mysql-drbd/
#mysql_install_db --user=mysql --datadir=/data/mysql-drbd/
...
160628 15:50:21 [Note] /usr/sbin/mysqld (mysqld 5.5.49-0ubuntu0.14.04.1) starting as process 8813 ...
160628 15:50:21 [Warning] Can't create test file /data/mysql-drbd/eva.lower-test
160628 15:50:21 [Warning] Can't create test file /data/mysql-drbd/eva.lower-test
...
曾经初学的时候 被 selinux 坑了无数回。 默认  Ubuntu selinux 是不安装的。 setenforce 0 临时关闭 因为这里没有 安装 selinux 所以直接略过。

How-to compile drbd-utils on ubuntu 14.04.4

Ubuntu 上安装 drbd8-utils 之后 创建资源 失败。 查看版本信息 发现内核模块和用户空间的管理工具的版本不匹配 ubuntu14.4.04 kernel中编译的 drbd module 版本是 8.4.5, 而官方trusty所提供的drbd8-utils的版本只到8.4.4, 只能手动编译了

How-to resolve Target WSGI script xxx.wsgi cannot be loaded as Python module

情景再现: 在我将 Flask应用程序部署到 Apache 的时候,我得到了一个  500 internal sever error 的错误。 查看错误日志得到下面信息

[Tue Jun 21 11:29:46 2016] [notice] Apache/2.2.15 (Unix) DAV/2 PHP/5.3.3 mod_ssl/2.2.15 OpenSSL/1.0.1e-fips mod_wsgi/3.2 Python/2.7.3 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming #
[Tue Jun 21 11:29:49 2016] [error] [client 172.16.7.158] mod_wsgi (pid=1334): Target WSGI script '/var/www/html/report/report.wsgi' cannot be loaded as Python module.
[Tue Jun 21 11:29:49 2016] [error] [client 172.16.7.158] mod_wsgi (pid=1334): Exception occurred processing WSGI script '/var/www/html/report/report.wsgi'.
[Tue Jun 21 11:29:49 2016] [error] [client 172.16.7.158] Traceback (most recent call last):
[Tue Jun 21 11:29:49 2016] [error] [client 172.16.7.158]   File "/var/www/html/report/report.wsgi", line 10, in <module>
[Tue Jun 21 11:29:49 2016] [error] [client 172.16.7.158]     from report import app as application
[Tue Jun 21 11:29:49 2016] [error] [client 172.16.7.158]   File "/var/www/html/report/report.py", line 11, in <module>
[Tue Jun 21 11:29:49 2016] [error] [client 172.16.7.158]     from flask import Flask
[Tue Jun 21 11:29:49 2016] [error] [client 172.16.7.158] ImportError: No module named falsk

Python 应用程序是 通过源码编译的,安装目录为 /usr/local/Python2.7.3 Flask 模块是存在的, 问题就在 为啥 找不到她呢???

How-to Make mod_wsgi use python2.7.3 instead of python2.6.6

场景再现:
CentOs 6.7 中 Python的 默认版本为 2.6.x, 而日常工作中仍是以 2.7.x 居多。
So问题来了,如果使用 Apache + mod_wsgi 构建 基于Python的 Web 服务器,如何修改其中的Python 默认版本呢?