基本环境:
centos 7.2 x64
- 使用外部etcd集群
- 使用LVS-VIP作为API
- 普通节点上不调度除了openstack以外的任何pod(包括flannel等kube-system的pod)
- 普通节点上尽量不操作任何物理机的iptables和网卡
- 认证流程
- api/scheduler/controller 的镜像
- kubernetes 二进制的编译制作
初始化操作:
- 更新软件包
yum update systemd
yum update dracut
- 关闭SElinux
# Use Enforcing or 1 to put SELinux in enforcing mode.
# Use Permissive or 0 to put SELinux in permissive mode.
setenforce 0
- 关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
- 添加/etc/hosts
echo -n "
192.4.5.6 docker-registry
10.202.145.86 node1
10.202.145.85 node2
" >>/etc/hosts
安装docker
- 安装
yum install docker
docker --version
Docker version 1.12.6, build 3a094bd/1.12.6
- 修改配置
修改docker配置文件/etc/sysconfig/docker,确保可以在docker私有仓库中拉到镜像
-INSECURE_REGISTRY='--insecure-registry docker-registry:5000'
+# INSECURE_REGISTRY='--insecure-registry'
可执行如下命令自动替换:
cp -vf /etc/sysconfig/docker /etc/sysconfig/docker.bak
perl -p -i -e "s/\#\ INSECURE_REGISTRY=\'--insecure-registry\'/INSECURE_REGISTRY=\'--insecure-registry\ docker-registry:5000\'/" /etc/sysconfig/docker
==关闭docker对iptables的控制==
/etc/sysconfig/docker 文件添加--iptables=false 选项
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --iptables=false'
- 启动
systemctl enable docker
systemctl start docker
# 如果之前已经启动,需要重启使配置生效。
systemctl restart docker
- 确认是否配置成功
启动成功后,可以测试一下是否可用:
docker pull docker-registry:5000/gcr.io/google_containers/etcd-amd64:3.0.17
系统配置
echo net.bridge.bridge-nf-call-ip6tables = 1 > /etc/sysctl.d/k8s.conf
echo net.bridge.bridge-nf-call-iptables = 1 >> /etc/sysctl.d/k8s.conf
sysctl -p /etc/sysctl.d/k8s.conf
安装k8s官方包
- 安装依赖包
yum install socat
- 安装k8s相关包 kubelet kubeadm kubectl kubernetes-cni
这些包都需要装,kubeadm依赖其他三个包。
安装v1.6.4版本:
cd
mkdir v1.6.4
cd v1.6.4
wget -c -r -np -nd -A *.rpm http://10.195.156.81:8888/kubenetes/v1.6.4/
rpm -ivh *.rpm
- 修改配置
在启动kubelet之前我们需要先修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf,为kubelet添加一个额外的参数如下,这样kubelet可以直接到私有仓库拉取pause-amd64:3.0镜像
--pod-infra-container-image=docker-registry:5000/gcr.io/google_containers/pause-amd64:3.0
也可以执行如下命令自动替换:
cd /etc/systemd/system/kubelet.service.d/
\cp -vf 10-kubeadm.conf 10-kubeadm.conf.bak
grep "KUBELET_EXTRA_ARGS " 10-kubeadm.conf || perl -p -i -e "s/KUBELET_EXTRA_ARGS/KUBELET_EXTRA_ARGS --pod-infra-container-image=docker-registry:5000\/gcr.io\/google_containers\/pause-amd64:3.0/" 10-kubeadm.conf
以上所有操作在所有集群节点上执行
- 初始化master节点,用到的镜像通过私有仓库提供
v1.6.4初始化:
export KUBE_REPO_PREFIX=docker-registry:5000/gcr.io/google_containers \
KUBE_HYPERKUBE_IMAGE=docker-registry:5000/gcr.io/google_containers/hyperkube-amd64:v1.6.4 \
KUBE_DISCOVERY_IMAGE=docker-registry:5000/gcr.io/google_containers/kube-discovery-amd64:1.0 \
KUBE_ETCD_IMAGE=docker-registry:5000/gcr.io/google_containers/etcd-amd64:3.0.17
kubeadm init --pod-network-cidr="10.24.0.0/16" --kubernetes-version=v1.6.4 --apiserver-advertise-address=10.198.66.242
==对接外部etcd集群==
# file: deploy.yaml
apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
#kubernetesVersion: "stable-1.7"
kubernetesVersion: "stable-1.6"
api:
advertiseAddress: 10.202.4.169
bindPort: 8080
etcd:
endpoints:
- http://10.202.4.169:2379
# 这个取决于kube-flannel.yml文件中定义的net-conf.json里的
networking:
podSubnet: 172.28.0.0/14
export KUBE_REPO_PREFIX=docker-registry:5000/gcr.io/google_containers \
KUBE_HYPERKUBE_IMAGE=docker-registry:5000/gcr.io/google_containers/hyperkube-amd64:v1.6.4 \
KUBE_DISCOVERY_IMAGE=docker-registry:5000/gcr.io/google_containers/kube-discovery-amd64:1.0
kubeadm init --config deploy.yaml
5、配置权限访问apiserver
为了使用kubectl访问apiserver,在~/.bashrc中追加下面的环境变量:
export KUBECONFIG=/etc/kubernetes/admin.conf
source ~/.bashrc
此时kubectl命令在master node上就好用了,查看一下当前机器中的Node:
kubectl get nodes
安装Pod Network
1、安装flannel network
# 其中镜像 quay.io/coreos/flannel:v0.7.1-amd64 已经是最新的
kubectl create -f kubenetes/kube-flannel-yaml/kube-flannel-rbac.yml
kubectl apply -f kubenetes/kube-flannel-yaml/kube-flannel.yml
2、查看确保所有的Pod都处于Running状态。
kubectl get pod --all-namespaces -o wide
五、使master node参与工作负载
使用kubeadm初始化的集群,出于安全考虑Pod不会被调度到Master Node上,也就是说Master Node不参与工作负载。
可以使用下面的命令使Master Node参与工作负载:
kubectl taint nodes --all node-role.kubernetes.io/master-
六、添加其他节点
1、可以先测试一下DNS是否可用
2、添加节点
在其他主机上直接执行如下操作即可:
kubeadm join --token 14cc9d.cb2d9fef16a2fb86 10.202.145.86:6443
==独立部署kubelet,不使用CNI,不操作iptables,不调度非openstack服务==
# 预先拷贝认证文件/etc/kubernetes/pki/ca.crt
# 预先拷贝配置文件(指定了server)/etc/kubernetes/kubelet.conf
# 这个配置文件的内容还需要再考虑一下,是否可以去掉这个, 直接使用--api-servers
kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --network-plugin=kubenet --authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt --cgroup-driver=systemd --pod-cidr=169.254.169.0/24 --register-with-taints="openstack=ture:NoSchedule"
做上述安装后,系统的iptables如下:
# Generated by iptables-save v1.4.21 on Tue Aug 22 16:45:37 2017
*filter
:INPUT ACCEPT [450:65525]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [285:65520]
:KUBE-FIREWALL - [0:0]
-A INPUT -j KUBE-FIREWALL
-A OUTPUT -j KUBE-FIREWALL
-A KUBE-FIREWALL -m comment --comment "kubernetes firewall for dropping marked packets" -m mark --mark 0x8000/0x8000 -j DROP
COMMIT
# Completed on Tue Aug 22 16:45:37 2017
# Generated by iptables-save v1.4.21 on Tue Aug 22 16:45:37 2017
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:KUBE-MARK-DROP - [0:0]
:KUBE-MARK-MASQ - [0:0]
:KUBE-POSTROUTING - [0:0]
-A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING
-A POSTROUTING ! -d 10.0.0.0/8 -m comment --comment "kubenet: SNAT for outbound traffic from cluster" -m addrtype ! --dst-type LOCAL -j MASQUERADE
-A KUBE-MARK-DROP -j MARK --set-xmark 0x8000/0x8000
-A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000
-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -m mark --mark 0x4000/0x4000 -j MASQUERADE
COMMIT
# Completed on Tue Aug 22 16:45:37 2017
前提条件:安装依赖环境到之前安装步骤的三.3
安装Dashboard
1、安装
kubectl create -f kubenetes/kubernetes-dashboard-v1.6.1.yaml
2、安装Heapster为集群添加使用统计和监控功能,为Dashboard添加仪表盘
kubectl create -f kubenetes/heapster-master-2ca8178a/rbac/heapster-rbac.yaml
kubectl create -f kubenetes/heapster-master-2ca8178a/influxdb/grafana.yaml
kubectl create -f kubenetes/heapster-master-2ca8178a/influxdb/heapster.yaml
kubectl create -f kubenetes/heapster-master-2ca8178a/influxdb/influxdb.yaml
3、通过proxy方式启动
kubectl proxy --address='' --accept-hosts='.+' &
网友评论