jrldc 发表于 2017-1-3 18:27:46

CentOS7.0上部署kubernetes集群

CentOS7.0上部署kubernetes集群

一. 部署环境及架构

[*]操作系统:centos 7.0
[*]flannel: 0.5.5
[*]Kubernetes: 1.3.0
[*]Etcd版本: 2.3.7
[*]Docker版本: 1.10.3
[*]集群信息:(此测试master和node1在同一个服务器)

RoleHostnameIP Address
Mastermaster192.168.99.119
Nodenode1192.168.99.119
Nodenode2192.168.99.109
master包含kube-apiserver kube-scheduler kube-controller-manager etcd四个组件
node包含kube-proxy和kubelet两个组件
1. kube-apiserver:位于master节点,接受用户请求。
2. kube-scheduler:位于master节点,负责资源调度,即pod建在哪个node节点。
3. kube-controller-manager:位于master节点,包含ReplicationManager,Endpointscontroller,Namespacecontroller,and Nodecontroller等。
4. etcd:分布式键值存储系统,共享整个集群的资源对象信息。
5. kubelet:位于node节点,负责维护在特定主机上运行的pod。
6. kube-proxy:位于node节点,它起的作用是一个服务代理的角色。

二 、安装步骤
准备工作
关闭防火墙
为了避免和Docker的iptables产生冲突,我们需要关闭node上的防火墙:

1
2$ systemctl stop firewalld
$ systemctl disable firewalld

安装NTP(详细配置不做赘述)
为了让各个服务器的时间保持一致,还需要为所有的服务器安装NTP:

1
2
3$ yum -y install ntp
$ systemctl start ntpd
$ systemctl enable ntpd

在192.168.99.109上部署docker本地仓库(不赘述)。

部署Master(192.168.99.119)
安装etcd和kubernetes

1$ yum -y install etcd kubernetes

配置etcd
修改etcd的配置文件/etc/etcd/etcd.conf:

1
2
3ETCD_NAME=default
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

配置etcd中的网络
定义etcd中的网络配置,nodeN中的flannel service会拉取此配置

1$ etcdctl mk /coreos.com/network/config '{"Network":"172.17.0.0/16"}'


配置Kubernetes API server
# cat/etc/kubernetes/apiserver
KUBE_API_ADDRESS="--address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.99.119:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""
这里需要注意原来KUBE_ADMISSION_CONTROL默认包含的ServiceAccount要删掉,不然启动API server的时候会报错。
启动服务
接下来,在Master上启动下面的服务:

1
2
3
4
5$for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done

部署Node
安装Kubernetes和Flannel

1$ yum -y install flannel kubernetes

配置Flannel
修改Flannel的配置文件/etc/sysconfig/flanneld:

1
2
3# cat /etc/sysconfig/flanneld
# Flanneld configuration options
# etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://192.168.99.119:2379"
# etcd config key. This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/coreos.com/network"
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
FLANNEL_OPTIONS="--iface=ens3"

这里需要注意FLANNEL_OPTIONS中的iface的值是你自己服务器的网卡,不同的服务器以及配置下和我的是不一样的。FLANNEL_ETCD_PREFIX="/coreos.com/network" 此值
与         # etcdctl ls   /coreos.com/
/coreos.com/network 一致

启动Flannel

1
2
3$systemctl restart flanneld
$systemctl enable flanneld
$systemctl status flanneld

上传网络配置
在当前目录下创建一个config.json,内容如下:

1
2
3
4
5
6
7
8{
"Network": "172.17.0.0/16",
"SubnetLen": 24,
"Backend": {
"Type": "vxlan",
"VNI": 7890
}
}

然后将配置上传到etcd服务器上:

1$ curl -L http://192.168.99.119:2379/v2/keys/coreos.com/network/config -XPUT --data-urlencode value@config.json

修改Kubernetes配置
修改kubernetes默认的配置文件/etc/kubernetes/config:

1KUBE_MASTER="--master=http://192.168.99.119:8080"

修改kubelet配置
修改kubelet服务的配置文件/etc/kubernetes/kubelet:

1
2
3
4
5
6KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
# change the hostname to minion IP address
KUBELET_HOSTNAME="--hostname_override=node1"
KUBELET_API_SERVER="--api_servers=http://192.168.99.119:8080"
KUBELET_ARGS=""

不同node节点只需要更改KUBELET_HOSTNAME 为node的hostname即可。
注意:本机的hostname值: 如果没有设置,kubectl get nodes查询不到node节点。
hostnamectl -set-hostname node1(节点名称)

启动node服务

1
2
3
4
5$ for SERVICES in kube-proxy kubelet docker; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done

创建快照,其他节点用快照安装(修改相应的hostname以及KUBELET_HOSTNAME即可)
查看集群nodes
部署完成之后,可以kubectl命令在各个节点查看整个集群的状态:
kubectl -s "http://192.168.99.119:8080" get nodes
# kubectl -s "http://192.168.99.119:8080" get nodes
NAME      STATUS    AGE
node1   Ready   6d
node2   Ready   6d

注意:
/etc/hosts下hostname的配置

node1192.168.99.119
node2192.168.99.109


获取namespace名称为非default的pod,service等
kubectl get pods,services --namespace=kube-system

1、tomcat集群配置:
# cattomcat-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: tomcat-controller
spec:
replicas: 2
selector:
    name: tomcat
template:
    metadata:
      labels:
      name: tomcat
    spec:
      containers:
      - name: tomcat
      image: 192.168.99.109:5000/tomcat7-java8
      ports:
          - containerPort: 8080
            hostPort: 8090#容器映射到服务器端口
      volumeMounts:
      - mountPath: /usr/local/tomcat/webapps #容器内路径
          name: nginx-www #挂载名称需要一致
      volumes:
      - hostPath:
          path: /data/tomcat#容器外路径
      name: nginx-www
#挂载
# cattomcat-service.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat-service-nodeport
spec:
ports:
    - port: 9000
      targetPort: 8090
      protocol: TCP
type: NodePort
selector:
    name: tomcat

2、mysql主从配置脚本:
# catmysql-master-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql-master
labels:
    name: mysql-master
spec:
replicas: 1
selector:
    name: mysql-master
template:
    metadata:
      labels:
      name: mysql-master
    spec:
      containers:
      - name: mysql-master
      image: 192.168.99.109:5000/mysql-master
      ports:
      - containerPort: 3306
          hostPort: 3306
      env:
      - name: MYSQL_ROOT_PASSWORD
          value: "123456"
      - name: MYSQL_REPLICATION_USER
          value: "repl"
      - name: MYSQL_REPLICATION_PASSWORD
          value: "123456"
# catmysql-master-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-master
labels:
    name: mysql-master
spec:
ports:
# the port that this service should serve on
- port: 3306
    targetPort: 3306
selector:
    name: mysql-master

# catmysql-slave-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql-slave
labels:
    name: mysql-slave
spec:
replicas: 1
selector:
    name: mysql-slave
template:
    metadata:
      labels:
      name: mysql-slave
    spec:
      containers:
      - name: mysql-slave
      image: 192.168.99.109:5000/mysql-slave
      ports:
      - containerPort: 3306
      env:
      - name: MYSQL_ROOT_PASSWORD
          value: "123456"
      - name: MYSQL_REPLICATION_USER
          value: "repl"
      - name: MYSQL_REPLICATION_PASSWORD
          value: "123456"
# catmysql-slave-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-slave
labels:
    name: mysql-slave
spec:
ports:
- port: 3306
selector:
    name: mysql-slave


boboge 发表于 2017-1-13 22:48:35

写的蛮细致的。
页: [1]
查看完整版本: CentOS7.0上部署kubernetes集群