准备工作:
一、开通云服务器
建站首先要有服务器和域名,对于个人使用的小型网站,一台1核CPU|2G内存|1M带宽|40G系统盘的云服务器ECS实例即可满足需要。目前国内主流云服务提供商为阿里云、腾讯云。
这里展示以阿里云为例,腾讯云也是大同小异的,如何开通云服务器这里略过,见“如何快速搭建自己独立的个人博客?”文章有详情介绍;
Kubernetes 简介:
Kubernetes 是 Google 开源的基于 Docker 的容器集群管理系统,通过 yaml 语言写的配置文件,简单快速的就能自动部署好应用环境,支持应用横向扩展,并且可以组织、编排、管理和迁移这些容器化的应用
一、环境要求
需要rhel7/centos7及以上版本 ,内核3.10及以上。
系统版本 | 主机名 | IP地址 | 服务 |
RHEL7.2 | master01 | 10.0.93.205 | apiserver,etcd,controler,scheduler |
RHEL7.2 | minion01 | 10.0.93.1 | aroxy,kubelet,flanneld |
RHEL7.2 | minion02 | 10.0.93.141 | aroxy,kubelet,flanneld |
CentOS6.6 | 宿主机 | 10.0.93.168 | Yum源,KVM宿主机 |
系统环境配置:基础系统环境配置需要在所有节点kubernetes进行配置。
1.1)、NTP配置
如内网无法访问公网,则需要单独配置一台NTP服务器用作时间同步;如可以访问直接使用公网的NTP服务器。
a)、该设备能通公网:
NTP服务器中默认配置有公网NTP地址。
#yum install -y ntp
#systemctl start ntpd
#systemctl enable ntpd
b)、该设备不能通公网:
添加内网NTP服务器地址至NTP配置文件中
#yum install -y ntp
#echo “server 10.0.93.168” >>/etc/ntp.conf # 10.0.93.168为内网NTP服务器
#systemctl start ntpd
#systemctl enable ntpd
1.2)、DNS配置
修改/etc/hosts添加IP到主机名的解析:
# cat /etc/hosts
10.0.93.205 master01
10.0.93.1 minion01
1.3)、防火墙配置
关闭防火墙:
注意:关闭防火墙暂时对Kubernetes网络架构影响,后续有待观察。
#systemctl stop firewalld.service
#systemctl disable firewalld.service
#systemctl stop iptables.service
#systemctl disable iptables.service
1.4)、YUM源设置
本文提供基于rpm的yum安装方式,需要事先缓存好kubernetes环境需要的所有安装包,并且在内网环境中制作成yum源(本例中yum源是168)。方法如下:
将缓存的包上传至/var/ftp/pub/k8s/
从上传的软件包中安装vsftpd
#rpm -ivh vsftpd-3.0.2-10.el7.x86_64.rpm
#systemctl start vsftpd
默认情况下是允许匿名登录的,目录是:/var/ftp/
从上传的软件包中安装yum源制作命令
#rpm -ivh createrepo-0.9.9-23.el7.noarch.rpm
把需要安装的rpm包放在/var/ftp/pub/目录下,执行yum源制作命令
createrepo /var/ftp/pub/k8s/
新增 /etc/yum.repos.d/k8s.repo 增加以下内容
[k8s]
name=k8s
baseurl=ftp://10.0.93.168/pub
enabled=1
gpgcheck=0
增加yum源后,执行下面两句,重新缓存rpm元数据
#yum clean all
二、K8S master 安装配置
2.1)、安装k8s软件包 ,K8S可以通过多种方式安装,此文档提供yum方法安装。
sudo yum -y install --enablerepo=k8s docker-selinux
sudo yum -y install --enablerepo=k8s docker
sudo yum -y install --enablerepo=k8s socat
sudo yum -y install --enablerepo=k8s flannel
sudo yum -y install --enablerepo=k8s ntp
sudo yum -y install --enablerepo=k8s ntpdate
sudo yum -y install --enablerepo=k8s kubernetes-node
sudo yum -y install --enablerepo=k8s kubernetes-client
sudo yum -y install --enablerepo=k8s kubernetes-master
sudo yum -y install --enablerepo=k8s kubernetes
sudo yum -y install --enablerepo=k8s etcd
2.2)、软件配置
a)、配置docker
修改docker配置文件,允许远程访问:
sudo sed -i "/OPTIONS/c OPTIONS='--insecure-registry 10.0.93.205:5000 --selinux-enabled -H tcp://0.0.0.0:28015 -H unix://var/run/docker.sock'" /etc/sysconfig/docker
注意:--insecure-registry 后面跟的是私用仓库地址,根据实际部署情况修改。
启动docker
sudo systemctl restart docker
b)、配置k8s
修改k8s apiserver文件
sudo sed -i "/KUBE_API_ADDRESS/c KUBE_API_ADDRESS=\"--address=0.0.0.0\"" /etc/kubernetes/apiserver
sudo sed -i "/# KUBE_API_PORT/c KUBE_API_PORT=\"--port=8080\"" /etc/kubernetes/apiserver
sudo sed -i "/# KUBELET_PORT/c KUBELET_PORT=\"--kubelet_port=10250\"" /etc/kubernetes/apiserver
sudo sed -i "/KUBE_ETCD_SERVERS/c KUBE_ETCD_SERVERS=\"--etcd_servers=http://master01:2379\"" /etc/kubernetes/apiserver
sudo sed -i "/KUBE_ADMISSION_CONTROL/c KUBE_ADMISSION_CONTROL=\"--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota\"" /etc/kubernetes/apiserver
修改k8s etcd文件
sudo sed -i "/ETCD_LISTEN_CLIENT_URLS/c ETCD_LISTEN_CLIENT_URLS=\"http://0.0.0.0:2379\"" /etc/etcd/etcd.conf
sudo sed -i "/ETCD_ADVERTISE_CLIENT_URLS/c ETCD_ADVERTISE_CLIENT_URLS=\"http://localhost:2379\"" /etc/etcd/etcd.conf
修改k8s flanneld文件
sudo sed -i "/FLANNEL_ETCD=/c FLANNEL_ETCD=\"http://127.0.0.1:2379\"" /etc/sysconfig/flanneld
sudo sed -i "/FLANNEL_ETCD_KEY=/c FLANNEL_ETCD_KEY=\"/coreos.com/network\"" /etc/sysconfig/flanneld
2.3)、启动K8S服务:
启动master上运行的服务
for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler ; do
systemctl restart $SERVICES
systemctl enable $SERVICES systemctl status $SERVICES
Done
设置flanneld的IP段,重新启动flanneld
sudo etcdctl mk /coreos.com/network/config '{"Network":"172.17.0.0/16"}'
sudo systemctl restart flanneld
sudo systemctl enable flanneld
sudo systemctl status flanneld
三、K8S minion 安装配置
3.1)、yum安装minion
sudo yum -y install --enablerepo=k8s docker-selinux
sudo yum -y install --enablerepo=k8s docker
sudo yum -y install --enablerepo=k8s socat
sudo yum -y install --enablerepo=k8s flannel
sudo yum -y install --enablerepo=k8s ntp
sudo yum -y install --enablerepo=k8s ntpdate
sudo yum -y install --enablerepo=k8s kubernetes-node
sudo yum -y install --enablerepo=k8s kubernetes-client
sudo yum -y install --enablerepo=k8s kubernetes-master
sudo yum -y install --enablerepo=k8s kubernetes
sudo yum -y install --enablerepo=k8s etcd
3.2)、软件配置
a)、配置docker
修改docker配置文件,允许远程访问
sudo sed -i "/OPTIONS/c OPTIONS='--insecure-registry 10.0.93.205:5000 --selinux-enabled -H tcp://0.0.0.0:28015 -H unix://var/run/docker.sock'" /etc/sysconfig/docker
注意:--insecure-registry 后面跟的是私用仓库地址,根据实际部署情况修改。
启动docker
sudo systemctl restart docker
sudo systemctl enable docker
b)、配置config
sudo echo "KUBE_ETCD_SERVERS=\"--etcd_servers=http://DSJ-signal-900G-98:2379\"" >> /etc/kubernetes/config
sudo sed -i "/KUBE_ALLOW_PRIV/c KUBE_ALLOW_PRIV=\"--allow_privileged=false\"" /etc/kubernetes/config
sudo sed -i "/KUBE_MASTER/c KUBE_MASTER=\"--master=http://DSJ-signal-900G-100:8080\"" /etc/kubernetes/config
c)、配置kbelet
sudo sed -i "/KUBELET_ADDRESS/c KUBELET_ADDRESS=\"--address=0.0.0.0\"" /etc/kubernetes/kubelet
sudo sed -i "/# KUBELET_PORT/c KUBELET_PORT=\"--port=10250\"" /etc/kubernetes/kubelet
sudo sed -i "/KUBELET_HOSTNAME/c KUBELET_HOSTNAME=\"--hostname_override=DSJ-signal-900G-98\"" /etc/kubernetes/kubelet
sudo sed -i "/KUBELET_API_SERVER/c KUBELET_API_SERVER=\"--api_servers=http://DSJ-signal-900G-100:8080\"" /etc/kubernetes/kubelet
sudo sed -i "/KUBELET_ARGS/c KUBELET_ARGS=\"--pod-infra-container-image=DSJ-signal-900G-100:5000/pause:0.8.0\"" /etc/kubernetes/kubelet
d)、配置flaneld
sudo sed -i "/FLANNEL_ETCD=/c FLANNEL_ETCD=\"http://DSJ-signal-900G-100:2379\"" /etc/sysconfig/flanneld
sudo sed -i "/FLANNEL_ETCD_KEY=/c FLANNEL_ETCD_KEY=\"/coreos.com/network\"" /etc/sysconfig/flanneld
e)、启动K8S服务
for SERVICES in kube-proxy kubelet docker flanneld; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
f)、设置docker的IP,重启docker
注意:这一步必须在所有minion进行设置,flannel类似交换机功能,互联各个docker0上的网桥,每个网桥IP地址段是不一样的。这样才能保证每个pod IP地址的唯一性
sudo flanneldIp=$(ip a | grep flannel | grep inet | awk '{print $2}' | awk -F '/' '{print $1}')
sudo ifconfig docker0 ${flanneldIp/.0/.1} netmask 255.255.255.0
sudo systemctl restart docker
sudo systemctl enable docker
3.3)、k8s集群部署DNS服务
a)、修改每个minion的/etc/kubernetes/kubelet配置文件
KUBELET_ARGS="--cluster-dns=10.254.100.100 --cluster-domain=cluster.local --pod-infra-container-image=172.16.71.169:5000/pause:0.8.0"
注:cluster-dns的值与skydns-svc.yaml文件中的值必须一致,并且DNS的网段必须跟定义service网段一致,本例中,APIserver 定义service 为10.254网段。
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
重启kubelet服务
systemctl restart kubelet
上传yaml文件到master节点的/etc/kubernetes/yaml
[root@master01 yaml]# pwd
/etc/kubernetes/yaml
[root@master01 yaml]# ll
total 0
drwxrwxr-x 4 root root 44 Feb 24 11:18 influxdb
drwxrwxr-x 2 root root 74 Feb 24 14:42 kube-ui
drwxrwxr-x 2 root root 68 Feb 25 10:59 skydns
启动dns服务 进入到dns的配置文件目录下,执行:
kubectl create-f /etc/kubernetes/yaml/kube-ui/kube-system.yaml
kubectl create -f /etc/kubernetes/yaml/skydns/skydns-rc.yaml
kubectl create -f /etc/kubernetes/yaml/skydns/skydns-svc.yaml
kubectl create -f /etc/kubernetes/yaml/skydns/busybox.yaml
注意:先执行RC文件,再执行SVC文件,这个是kubernetes架构要求的,先后顺序不能乱。
b)、验证DNS功能
#kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local
Server: 10.254.100.100
Address 1: 10.254.100.100
Name: kubernetes.default.svc.cluster.local
Address 1: 10.254.0.1
四、常见问题:
问题一:
localhost kube-apiserver: E1126 21:52:06.697708 1963 server.go:454] Unable to generate self signed cert: open /var/run/kubernetes/apiserver.crt: permission denied
处理:
# vi /usr/lib/systemd/system/kube-apiserver.service
[Service]
#在service下面添加以下内容。
PermissionsStartOnly=true
ExecStartPre=-/usr/bin/mkdir /var/run/kubernetes
ExecStartPre=/usr/bin/chown -R kube:kube /var/run/kubernetes/
# systemctl daemon-reload
# systemctl restart kube-apiserver
问题二:
Nov 26 21:52:06 localhost kube-apiserver: E1126 21:52:06.697818 1963 server.go:464] Unable to listen for secure (open /var/run/kubernetes/apiserver.crt: no such file or directory); will try again.
处理:# vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--secure-port=0"
在KUBE_API_ARGS加上--secure-port=0参数。
原因如下:
--secure-port=6443: The port on which to serve HTTPS with authentication and authorization. If 0, don't serve HTTPS at all.