├── 1.5 └── install.sh ├── 1.6 └── install.sh ├── 1.7 └── install.sh ├── LICENSE └── README.md /1.5/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # K8S offline install script. 4 | # Installed & verified by CentOS Linux release 7.3.1611 (Core) 5 | 6 | # Step 1 7 | # Start python simple http server first!!! 8 | # python -m SimpleHTTPServer 9 | # Serving HTTP on 0.0.0.0 port 8000 ... 10 | 11 | # Step 2 12 | # Run script with parameters 13 | 14 | # Server side: 15 | # curl -L http://192.168.0.104:8000/install.sh | bash -s master 16 | 17 | # Client side: 18 | # curl -L http://192.168.0.104:8000/install.sh | bash -s join --token=6669b1.81f129bc847154f9 192.168.0.104 19 | 20 | set -x 21 | set -e 22 | 23 | HTTP_SERVER=192.168.0.104:8000 24 | KUBE_REPO_PREFIX=gcr.io/google_containers 25 | 26 | root=$(id -u) 27 | if [ "$root" -ne 0 ] ;then 28 | echo must run as root 29 | exit 1 30 | fi 31 | 32 | kube::install_docker() 33 | { 34 | set +e 35 | which docker > /dev/null 2>&1 36 | i=$? 37 | set -e 38 | if [ $i -ne 0 ]; then 39 | curl -L http://$HTTP_SERVER/rpms/docker.tar.gz > /tmp/docker.tar.gz 40 | tar zxf /tmp/docker.tar.gz -C /tmp 41 | yum localinstall -y /tmp/docker/*.rpm 42 | kube::config_docker 43 | fi 44 | systemctl enable docker.service && systemctl start docker.service 45 | echo docker has been installed! 46 | docker version 47 | rm -rf /tmp/docker /tmp/docker.tar.gz 48 | } 49 | 50 | kube::config_docker() 51 | { 52 | setenforce 0 53 | sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 54 | 55 | #sysctl -w net.bridge.bridge-nf-call-iptables=1 56 | #sysctl -w net.bridge.bridge-nf-call-ip6tables=1 57 | # /etc/sysctl.conf 58 | # net.bridge.bridge-nf-call-ip6tables = 1 59 | # net.bridge.bridge-nf-call-iptables = 1 60 | systemctl disable firewalld 61 | systemctl stop firewalld 62 | 63 | echo DOCKER_STORAGE_OPTIONS=\" -s overlay --selinux-enabled=false\" > /etc/sysconfig/docker-storage 64 | systemctl daemon-reload && systemctl restart docker.service 65 | } 66 | 67 | kube::load_images() 68 | { 69 | mkdir -p /tmp/k8s 70 | 71 | master_images=( 72 | kube-apiserver-amd64_v1.5.1 73 | kube-controller-manager-amd64_v1.5.1 74 | kube-scheduler-amd64_v1.5.1 75 | kube-proxy-amd64_v1.5.1 76 | pause-amd64_3.0 77 | kube-discovery-amd64_1.0 78 | kubedns-amd64_1.9 79 | exechealthz-amd64_1.2 80 | kube-dnsmasq-amd64_1.4 81 | dnsmasq-metrics-amd64_1.0 82 | etcd_v3.0.15 83 | flannel-amd64_v0.7.0 84 | kubernetes-dashboard-amd64_1.6.0 85 | ) 86 | 87 | node_images=( 88 | pause-amd64_3.0 89 | kube-proxy-amd64_v1.5.1 90 | flannel-amd64_v0.7.0 91 | kubernetes-dashboard-amd64_1.6.0 92 | ) 93 | 94 | if [ $1 == "master" ]; then 95 | # 判断镜像是否存在,不存在才会去load 96 | for i in "${!master_images[@]}"; do 97 | ret=$(docker images | awk 'NR!=1{print $1"_"$2}'| grep $KUBE_REPO_PREFIX/${master_images[$i]} | wc -l) 98 | if [ $ret -lt 1 ];then 99 | curl -L http://$HTTP_SERVER/images/${master_images[$i]}.tar > /tmp/k8s/${master_images[$i]}.tar 100 | docker load < /tmp/k8s/${master_images[$i]}.tar 101 | fi 102 | done 103 | else 104 | for i in "${!node_images[@]}"; do 105 | ret=$(docker images | awk 'NR!=1{print $1"_"$2}' | grep $KUBE_REPO_PREFIX/${node_images[$i]} | wc -l) 106 | if [ $ret -lt 1 ];then 107 | curl -L http://$HTTP_SERVER/images/${node_images[$i]}.tar > /tmp/k8s/${node_images[$i]}.tar 108 | docker load < /tmp/k8s/${node_images[$i]}.tar 109 | fi 110 | done 111 | fi 112 | rm /tmp/k8s* -rf 113 | } 114 | 115 | kube::install_bin() 116 | { 117 | set +e 118 | which kubeadm > /dev/null 2>&1 119 | i=$? 120 | set -e 121 | if [ $i -ne 0 ]; then 122 | curl -L http://$HTTP_SERVER/rpms/k8s.tar.gz > /tmp/k8s.tar.gz 123 | tar zxf /tmp/k8s.tar.gz -C /tmp 124 | yum localinstall -y /tmp/k8s/*.rpm 125 | rm -rf /tmp/k8s* 126 | systemctl enable kubelet.service && systemctl start kubelet.service && rm -rf /etc/kubernetes 127 | fi 128 | } 129 | 130 | kube::config_firewalld() 131 | { 132 | systemctl disable firewalld && systemctl stop firewalld 133 | # iptables -A IN_public_allow -p tcp -m tcp --dport 9898 -m conntrack --ctstate NEW -j ACCEPT 134 | # iptables -A IN_public_allow -p tcp -m tcp --dport 6443 -m conntrack --ctstate NEW -j ACCEPT 135 | # iptables -A IN_public_allow -p tcp -m tcp --dport 10250 -m conntrack --ctstate NEW -j ACCEPT 136 | } 137 | 138 | kube::wati_manifests(){ 139 | while [[ ! -f /etc/kubernetes/manifests/kube-scheduler.json ]]; do 140 | sleep 2 141 | done 142 | } 143 | 144 | kube::config_manifests() 145 | { 146 | cd /etc/kubernetes/manifests 147 | for file in `ls` 148 | do 149 | sed -i '/image/a\ \"imagePullPolicy\": \"IfNotPresent\",' $file 150 | done 151 | } 152 | 153 | kube::wait_apiserver() 154 | { 155 | ret=1 156 | while [[ $ret != 0 ]]; do 157 | sleep 2 158 | curl -k https://127.0.0.1:6443 2>&1>/dev/null 159 | ret=$? 160 | done 161 | } 162 | 163 | kube::master_up() 164 | { 165 | kube::install_docker 166 | 167 | kube::load_images master 168 | 169 | kube::install_bin 170 | 171 | kube::config_firewalld 172 | 173 | # 这里一定要带上--pod-network-cidr参数,不然后面的flannel网络会出问题 174 | export KUBE_ETCD_IMAGE=quay.io/coreos/etcd:v3.0.15 175 | kubeadm init --use-kubernetes-version=v1.5.1 --pod-network-cidr=10.244.0.0/16 176 | 177 | # 改image pull 策略, 1.50之后不需要更改策略了, 默认就是 IfNotPresent 178 | # kube::wati_manifests && kube::config_manifests 179 | # kube::wait_apiserver 180 | 181 | # 使能master,可以被调度到 182 | # kubectl taint nodes --all dedicated- 183 | 184 | # install flannel network 185 | kubectl apply -f http://$HTTP_SERVER/network/kube-flannel.yaml 186 | 187 | #install dashboard 188 | kubectl apply -f http://$HTTP_SERVER/network/kubernetes-dashboard.yaml 189 | 190 | # show pods 191 | kubectl --namespace=kube-system get po 192 | } 193 | 194 | kube::node_up() 195 | { 196 | kube::install_docker 197 | 198 | kube::load_images minion 199 | 200 | kube::install_bin 201 | 202 | kube::config_firewalld 203 | 204 | kubeadm join $@ 205 | } 206 | 207 | kube::tear_down() 208 | { 209 | systemctl stop kubelet.service 210 | docker ps -aq|xargs -I '{}' docker stop {} 211 | docker ps -aq|xargs -I '{}' docker rm {} 212 | df |grep /var/lib/kubelet|awk '{ print $6 }'|xargs -I '{}' umount {} 213 | rm -rf /var/lib/kubelet && rm -rf /etc/kubernetes/ && rm -rf /var/lib/etcd 214 | yum remove -y kubectl kubeadm kubelet kubernetes-cni 215 | rm -rf /var/lib/cni 216 | ip link del cni0 217 | } 218 | 219 | main() 220 | { 221 | case $1 in 222 | "m" | "master" ) 223 | kube::master_up 224 | ;; 225 | "j" | "join" ) 226 | shift 227 | kube::node_up $@ 228 | ;; 229 | "d" | "down" ) 230 | kube::tear_down 231 | ;; 232 | *) 233 | echo "usage: $0 m[master] | j[join] token | d[down] " 234 | echo " $0 master to setup master " 235 | echo " $0 join to join master with token " 236 | echo " $0 down to tear all down ,inlude all data! so becarefull" 237 | echo " unkown command $0 $@" 238 | ;; 239 | esac 240 | } 241 | 242 | main $@ 243 | -------------------------------------------------------------------------------- /1.6/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # K8S offline install script. 4 | # Installed & verified by CentOS Linux release 7.3.1611 (Core) 5 | 6 | # Step 1 7 | # Start python simple http server first!!! 8 | # python -m SimpleHTTPServer 9 | # Serving HTTP on 0.0.0.0 port 8000 ... 10 | 11 | # Step 2 12 | # Run script with parameters 13 | 14 | # Server side: 15 | # curl -L http://192.168.0.104:8000/install.sh | bash -s master 16 | 17 | # Client side: 18 | # curl -L http://192.168.0.104:8000/install.sh | bash -s join --token=6669b1.81f129bc847154f9 192.168.0.104:6443 19 | 20 | set -x 21 | set -e 22 | 23 | HTTP_SERVER=192.168.0.104:8000 24 | KUBE_REPO_PREFIX=gcr.io/google_containers 25 | 26 | root=$(id -u) 27 | if [ "$root" -ne 0 ] ;then 28 | echo must run as root 29 | exit 1 30 | fi 31 | 32 | kube::install_docker() 33 | { 34 | set +e 35 | which docker > /dev/null 2>&1 36 | i=$? 37 | set -e 38 | if [ $i -ne 0 ]; then 39 | curl -L http://$HTTP_SERVER/rpms/docker.tar.gz > /tmp/docker.tar.gz 40 | tar zxf /tmp/docker.tar.gz -C /tmp 41 | yum localinstall -y /tmp/docker/*.rpm 42 | kube::config_docker 43 | fi 44 | systemctl enable docker.service && systemctl start docker.service 45 | echo docker has been installed! 46 | docker version 47 | rm -rf /tmp/docker /tmp/docker.tar.gz 48 | } 49 | 50 | kube::config_docker() 51 | { 52 | setenforce 0 53 | sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 54 | 55 | #sysctl -w net.bridge.bridge-nf-call-iptables=1 56 | #sysctl -w net.bridge.bridge-nf-call-ip6tables=1 57 | # /etc/sysctl.conf 58 | # net.bridge.bridge-nf-call-ip6tables = 1 59 | # net.bridge.bridge-nf-call-iptables = 1 60 | systemctl disable firewalld 61 | systemctl stop firewalld 62 | 63 | echo DOCKER_STORAGE_OPTIONS=\" -s overlay --selinux-enabled=false\" > /etc/sysconfig/docker-storage 64 | systemctl daemon-reload && systemctl restart docker.service 65 | } 66 | 67 | kube::load_images() 68 | { 69 | mkdir -p /tmp/k8s 70 | 71 | master_images=( 72 | kube-apiserver-amd64_v1.6.2 73 | kube-controller-manager-amd64_v1.6.2 74 | kube-scheduler-amd64_v1.6.2 75 | kube-proxy-amd64_v1.6.2 76 | pause-amd64_3.0 77 | k8s-dns-dnsmasq-nanny-amd64_1.14.1 78 | k8s-dns-kube-dns-amd64_1.14.1 79 | k8s-dns-sidecar-amd64_1.14.1 80 | etcd_v3.0.17 81 | flannel-amd64_v0.7.1 82 | kubernetes-dashboard-amd64_1.6.2 83 | ) 84 | 85 | node_images=( 86 | pause-amd64_3.0 87 | kube-proxy-amd64_v1.6.2 88 | flannel-amd64_v0.7.1 89 | kubernetes-dashboard-amd64_1.6.2 90 | ) 91 | 92 | if [ $1 == "master" ]; then 93 | # 判断镜像是否存在,不存在才会去load 94 | for i in "${!master_images[@]}"; do 95 | ret=$(docker images | awk 'NR!=1{print $1"_"$2}'| grep $KUBE_REPO_PREFIX/${master_images[$i]} | wc -l) 96 | if [ $ret -lt 1 ];then 97 | curl -L http://$HTTP_SERVER/images/${master_images[$i]}.tar > /tmp/k8s/${master_images[$i]}.tar 98 | docker load < /tmp/k8s/${master_images[$i]}.tar 99 | fi 100 | done 101 | else 102 | for i in "${!node_images[@]}"; do 103 | ret=$(docker images | awk 'NR!=1{print $1"_"$2}' | grep $KUBE_REPO_PREFIX/${node_images[$i]} | wc -l) 104 | if [ $ret -lt 1 ];then 105 | curl -L http://$HTTP_SERVER/images/${node_images[$i]}.tar > /tmp/k8s/${node_images[$i]}.tar 106 | docker load < /tmp/k8s/${node_images[$i]}.tar 107 | fi 108 | done 109 | fi 110 | rm /tmp/k8s* -rf 111 | } 112 | 113 | kube::install_bin() 114 | { 115 | set +e 116 | which kubeadm > /dev/null 2>&1 117 | i=$? 118 | set -e 119 | if [ $i -ne 0 ]; then 120 | curl -L http://$HTTP_SERVER/rpms/k8s.tar.gz > /tmp/k8s.tar.gz 121 | tar zxf /tmp/k8s.tar.gz -C /tmp 122 | yum localinstall -y /tmp/k8s/*.rpm 123 | rm -rf /tmp/k8s* 124 | 125 | # Change cgroup-driver for kubelet 126 | sed -i -e 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 127 | #sed -i -e 's/$KUBELET_NETWORK_ARGS//g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 128 | 129 | # Enable and start kubelet service 130 | systemctl enable kubelet.service && systemctl start kubelet.service && rm -rf /etc/kubernetes 131 | fi 132 | } 133 | 134 | kube::config_firewalld() 135 | { 136 | systemctl disable firewalld && systemctl stop firewalld 137 | # iptables -A IN_public_allow -p tcp -m tcp --dport 9898 -m conntrack --ctstate NEW -j ACCEPT 138 | # iptables -A IN_public_allow -p tcp -m tcp --dport 6443 -m conntrack --ctstate NEW -j ACCEPT 139 | # iptables -A IN_public_allow -p tcp -m tcp --dport 10250 -m conntrack --ctstate NEW -j ACCEPT 140 | } 141 | 142 | kube::wati_manifests(){ 143 | while [[ ! -f /etc/kubernetes/manifests/kube-scheduler.json ]]; do 144 | sleep 2 145 | done 146 | } 147 | 148 | kube::config_manifests() 149 | { 150 | cd /etc/kubernetes/manifests 151 | for file in `ls` 152 | do 153 | sed -i '/image/a\ \"imagePullPolicy\": \"IfNotPresent\",' $file 154 | done 155 | } 156 | 157 | kube::wait_apiserver() 158 | { 159 | ret=1 160 | while [[ $ret != 0 ]]; do 161 | sleep 2 162 | curl -k https://127.0.0.1:6443 2>&1>/dev/null 163 | ret=$? 164 | done 165 | } 166 | 167 | kube::master_up() 168 | { 169 | kube::install_docker 170 | 171 | kube::load_images master 172 | 173 | kube::install_bin 174 | 175 | kube::config_firewalld 176 | 177 | # kubeadm需要联网去找最新版本 178 | echo $HTTP_SERVER storage.googleapis.com >> /etc/hosts 179 | 180 | # 这里一定要带上--pod-network-cidr参数,不然后面的flannel网络会出问题 181 | export KUBE_ETCD_IMAGE=gcr.io/google_containers/etcd-amd64:3.0.17 182 | kubeadm init --kubernetes-version=v1.6.2 --pod-network-cidr=10.96.0.0/12 183 | 184 | # 使能master,可以被调度到 185 | # kubectl taint nodes --all dedicated- 186 | 187 | export KUBECONFIG=/etc/kubernetes/admin.conf 188 | 189 | # install flannel network 190 | kubectl apply -f http://$HTTP_SERVER/network/kube-flannel-rbac.yml 191 | kubectl apply -f http://$HTTP_SERVER/network/kube-flannel.yml --namespace=kube-system 192 | 193 | #install dashboard 194 | kubectl create -f http://$HTTP_SERVER/network/kubernetes-dashboard-rbac.yml 195 | kubectl create -f http://$HTTP_SERVER/network/kubernetes-dashboard.yml 196 | 197 | # show pods 198 | kubectl get po --all-namespaces 199 | 200 | # show tokens 201 | kubeadm token list 202 | 203 | echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc 204 | echo "Please reload ~/.bashrc to use kubectl command!" 205 | echo "K8S master install finished!" 206 | } 207 | 208 | kube::node_up() 209 | { 210 | kube::install_docker 211 | 212 | kube::load_images minion 213 | 214 | kube::install_bin 215 | 216 | kube::config_firewalld 217 | 218 | kubeadm join $@ 219 | } 220 | 221 | kube::tear_down() 222 | { 223 | systemctl stop kubelet.service 224 | docker ps -aq|xargs -I '{}' docker stop {} 225 | docker ps -aq|xargs -I '{}' docker rm {} 226 | df |grep /var/lib/kubelet|awk '{ print $6 }'|xargs -I '{}' umount {} 227 | rm -rf /var/lib/kubelet && rm -rf /etc/kubernetes/ && rm -rf /var/lib/etcd 228 | yum remove -y kubectl kubeadm kubelet kubernetes-cni 229 | rm -rf /var/lib/cni 230 | ip link del cni0 231 | } 232 | 233 | main() 234 | { 235 | case $1 in 236 | "m" | "master" ) 237 | kube::master_up 238 | ;; 239 | "j" | "join" ) 240 | shift 241 | kube::node_up $@ 242 | ;; 243 | "d" | "down" ) 244 | kube::tear_down 245 | ;; 246 | *) 247 | echo "usage: $0 m[master] | j[join] token | d[down] " 248 | echo " $0 master to setup master " 249 | echo " $0 join to join master with token " 250 | echo " $0 down to tear all down ,inlude all data! so becarefull" 251 | echo " unkown command $0 $@" 252 | ;; 253 | esac 254 | } 255 | 256 | main $@ 257 | -------------------------------------------------------------------------------- /1.7/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # K8S offline install script. 4 | # Installed & verified by CentOS Linux release 7.3.1611 (Core) 5 | 6 | # Step 1 7 | # Start python simple http server first!!! 8 | # python -m SimpleHTTPServer 9 | # Serving HTTP on 0.0.0.0 port 8000 ... 10 | 11 | # Step 2 12 | # Run script with parameters 13 | 14 | # Server side: 15 | # curl -L http://192.168.0.104:8000/install.sh | bash -s master 16 | 17 | # Client side: 18 | # curl -L http://192.168.0.104:8000/install.sh | bash -s join --token=6669b1.81f129bc847154f9 192.168.0.104:6443 19 | 20 | set -x 21 | set -e 22 | 23 | HTTP_SERVER=192.168.0.104:8000 24 | KUBE_REPO_PREFIX=gcr.io/google_containers 25 | 26 | root=$(id -u) 27 | if [ "$root" -ne 0 ] ;then 28 | echo must run as root 29 | exit 1 30 | fi 31 | 32 | kube::install_docker() 33 | { 34 | set +e 35 | which docker > /dev/null 2>&1 36 | i=$? 37 | set -e 38 | if [ $i -ne 0 ]; then 39 | curl -L http://$HTTP_SERVER/rpms/docker.tar.gz > /tmp/docker.tar.gz 40 | tar zxf /tmp/docker.tar.gz -C /tmp 41 | yum localinstall -y /tmp/docker/*.rpm 42 | kube::config_docker 43 | fi 44 | systemctl enable docker.service && systemctl start docker.service 45 | echo docker has been installed! 46 | docker version 47 | rm -rf /tmp/docker /tmp/docker.tar.gz 48 | } 49 | 50 | kube::config_docker() 51 | { 52 | setenforce 0 53 | sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 54 | 55 | #sysctl -w net.bridge.bridge-nf-call-iptables=1 56 | #sysctl -w net.bridge.bridge-nf-call-ip6tables=1 57 | # /etc/sysctl.conf 58 | # net.bridge.bridge-nf-call-ip6tables = 1 59 | # net.bridge.bridge-nf-call-iptables = 1 60 | systemctl disable firewalld 61 | systemctl stop firewalld 62 | 63 | echo DOCKER_STORAGE_OPTIONS=\" -s overlay --selinux-enabled=false\" > /etc/sysconfig/docker-storage 64 | systemctl daemon-reload && systemctl restart docker.service 65 | } 66 | 67 | kube::load_images() 68 | { 69 | mkdir -p /tmp/k8s 70 | 71 | master_images=( 72 | kube-apiserver-amd64_v1.7.2 73 | kube-controller-manager-amd64_v1.7.2 74 | kube-scheduler-amd64_v1.7.2 75 | kube-proxy-amd64_v1.7.2 76 | pause-amd64_3.0 77 | k8s-dns-dnsmasq-nanny-amd64_1.14.4 78 | k8s-dns-kube-dns-amd64_1.14.4 79 | k8s-dns-sidecar-amd64_1.14.4 80 | etcd_v3.0.17 81 | flannel-amd64_v0.8.0 82 | kubernetes-dashboard-amd64_1.6.3 83 | ) 84 | 85 | node_images=( 86 | pause-amd64_3.0 87 | kube-proxy-amd64_v1.7.2 88 | flannel-amd64_v0.8.0 89 | kubernetes-dashboard-amd64_1.6.3 90 | ) 91 | 92 | if [ $1 == "master" ]; then 93 | # 判断镜像是否存在,不存在才会去load 94 | for i in "${!master_images[@]}"; do 95 | ret=$(docker images | awk 'NR!=1{print $1"_"$2}'| grep $KUBE_REPO_PREFIX/${master_images[$i]} | wc -l) 96 | if [ $ret -lt 1 ];then 97 | curl -L http://$HTTP_SERVER/images/${master_images[$i]}.tar > /tmp/k8s/${master_images[$i]}.tar 98 | docker load < /tmp/k8s/${master_images[$i]}.tar 99 | fi 100 | done 101 | else 102 | for i in "${!node_images[@]}"; do 103 | ret=$(docker images | awk 'NR!=1{print $1"_"$2}' | grep $KUBE_REPO_PREFIX/${node_images[$i]} | wc -l) 104 | if [ $ret -lt 1 ];then 105 | curl -L http://$HTTP_SERVER/images/${node_images[$i]}.tar > /tmp/k8s/${node_images[$i]}.tar 106 | docker load < /tmp/k8s/${node_images[$i]}.tar 107 | fi 108 | done 109 | fi 110 | rm /tmp/k8s* -rf 111 | } 112 | 113 | kube::install_bin() 114 | { 115 | set +e 116 | which kubeadm > /dev/null 2>&1 117 | i=$? 118 | set -e 119 | if [ $i -ne 0 ]; then 120 | curl -L http://$HTTP_SERVER/rpms/k8s.tar.gz > /tmp/k8s.tar.gz 121 | tar zxf /tmp/k8s.tar.gz -C /tmp 122 | yum localinstall -y /tmp/k8s/*.rpm 123 | rm -rf /tmp/k8s* 124 | 125 | # Change cgroup-driver for kubelet 126 | sed -i -e 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 127 | #sed -i -e 's/$KUBELET_NETWORK_ARGS//g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 128 | 129 | # Enable and start kubelet service 130 | systemctl enable kubelet.service && systemctl start kubelet.service && rm -rf /etc/kubernetes 131 | fi 132 | } 133 | 134 | kube::config_firewalld() 135 | { 136 | systemctl disable firewalld && systemctl stop firewalld 137 | # iptables -A IN_public_allow -p tcp -m tcp --dport 9898 -m conntrack --ctstate NEW -j ACCEPT 138 | # iptables -A IN_public_allow -p tcp -m tcp --dport 6443 -m conntrack --ctstate NEW -j ACCEPT 139 | # iptables -A IN_public_allow -p tcp -m tcp --dport 10250 -m conntrack --ctstate NEW -j ACCEPT 140 | } 141 | 142 | kube::wati_manifests(){ 143 | while [[ ! -f /etc/kubernetes/manifests/kube-scheduler.json ]]; do 144 | sleep 2 145 | done 146 | } 147 | 148 | kube::config_manifests() 149 | { 150 | cd /etc/kubernetes/manifests 151 | for file in `ls` 152 | do 153 | sed -i '/image/a\ \"imagePullPolicy\": \"IfNotPresent\",' $file 154 | done 155 | } 156 | 157 | kube::wait_apiserver() 158 | { 159 | ret=1 160 | while [[ $ret != 0 ]]; do 161 | sleep 2 162 | curl -k https://127.0.0.1:6443 2>&1>/dev/null 163 | ret=$? 164 | done 165 | } 166 | 167 | kube::master_up() 168 | { 169 | kube::install_docker 170 | 171 | kube::load_images master 172 | 173 | kube::install_bin 174 | 175 | kube::config_firewalld 176 | 177 | # kubeadm需要联网去找最新版本 178 | echo $HTTP_SERVER storage.googleapis.com >> /etc/hosts 179 | 180 | # 这里一定要带上--pod-network-cidr参数,不然后面的flannel网络会出问题 181 | export KUBE_ETCD_IMAGE=gcr.io/google_containers/etcd-amd64:3.0.17 182 | kubeadm init --kubernetes-version=v1.7.2 --pod-network-cidr=10.96.0.0/12 183 | 184 | # 使能master,可以被调度到 185 | # kubectl taint nodes --all dedicated- 186 | 187 | export KUBECONFIG=/etc/kubernetes/admin.conf 188 | 189 | # install flannel network 190 | kubectl apply -f http://$HTTP_SERVER/network/kube-flannel-rbac.yml 191 | kubectl apply -f http://$HTTP_SERVER/network/kube-flannel.yml --namespace=kube-system 192 | 193 | #install dashboard 194 | kubectl create -f http://$HTTP_SERVER/network/kubernetes-dashboard.yml 195 | 196 | # show pods 197 | kubectl get po --all-namespaces 198 | 199 | # show tokens 200 | kubeadm token list 201 | 202 | echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc 203 | echo "Please reload ~/.bashrc to use kubectl command!" 204 | echo "K8S master install finished!" 205 | } 206 | 207 | kube::node_up() 208 | { 209 | kube::install_docker 210 | 211 | kube::load_images minion 212 | 213 | kube::install_bin 214 | 215 | kube::config_firewalld 216 | 217 | kubeadm join --skip-preflight-checks $@ 218 | } 219 | 220 | kube::tear_down() 221 | { 222 | systemctl stop kubelet.service 223 | docker ps -aq|xargs -I '{}' docker stop {} 224 | docker ps -aq|xargs -I '{}' docker rm {} 225 | df |grep /var/lib/kubelet|awk '{ print $6 }'|xargs -I '{}' umount {} 226 | rm -rf /var/lib/kubelet && rm -rf /etc/kubernetes/ && rm -rf /var/lib/etcd 227 | yum remove -y kubectl kubeadm kubelet kubernetes-cni 228 | rm -rf /var/lib/cni 229 | ip link del cni0 230 | } 231 | 232 | main() 233 | { 234 | case $1 in 235 | "m" | "master" ) 236 | kube::master_up 237 | ;; 238 | "j" | "join" ) 239 | shift 240 | kube::node_up $@ 241 | ;; 242 | "d" | "down" ) 243 | kube::tear_down 244 | ;; 245 | *) 246 | echo "usage: $0 m[master] | j[join] token | d[down] " 247 | echo " $0 master to setup master " 248 | echo " $0 join to join master with token " 249 | echo " $0 down to tear all down ,inlude all data! so becarefull" 250 | echo " unkown command $0 $@" 251 | ;; 252 | esac 253 | } 254 | 255 | main $@ 256 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Timothy Ye 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Kubernetes Offline 2 | 3 | Offline installer for kubernetes. 4 | 5 | ## Introduction 6 | 7 | This project is modified from [k8s-deploy](https://github.com/xiaoping378/k8s-deploy), it provides offline installation solution for kubernetes. It is useful for deploying K8S to __OFFLINE__ production environment. 8 | 9 | #### Supported kubernetes version: 10 | * 1.5.1 11 | * 1.6.2 12 | * 1.7.2 13 | 14 | #### The offline installer will install: 15 | 16 | * Docker (1.12.6) 17 | * All the kubernetes components 18 | * Kubernetes dashboard, with default node port:```31234``` 19 | 20 | ## Requirement & Limitation 21 | 22 | * Offline installer is __ONLY FOR CentOS__. 23 | * All the installers are installed & verified by: __CentOS Linux release 7.3.1611 (Core)__ 24 | * Right now, offline installer only installs K8S master with __SINGLE__ instance, K8S master HA is __NOT__ supported yet. 25 | 26 | ## Navigation 27 | 28 | [Offline installer for K8S 1.5](#offline-installer-for-k8s-15) 29 | 30 | [Offline installer for K8S 1.6](#offline-installer-for-k8s-16) 31 | 32 | [Offline installer for K8S 1.7](#offline-installer-for-k8s-17) 33 | 34 | ## Offline installer for K8S 1.5 35 | 36 | __Kubernetes Version: 1.5.1__ 37 | 38 | ### Prepare the dispatch server 39 | 1. Downlaod installer from 百度网盘: 40 | URL: [https://pan.baidu.com/s/1mikM3Ao](https://pan.baidu.com/s/1mikM3Ao) 41 | Code: bvj5 42 | 2. Copy it to the production server 43 | 3. Go to the installer directory, host it with a simple HTTP server by Python: 44 | 45 | ```bash 46 | [root@master k8s-deploy-1.5]# python -m SimpleHTTPServer 47 | Serving HTTP on 0.0.0.0 port 8000 ... 48 | ``` 49 | 50 | ### Install K8S master 51 | 52 | 1. Get the IP address of dispatch server, for example: 192.168.0.10 53 | 2. Install K8S master via curl: 54 | 55 | ```bash 56 | curl -L http://192.168.0.10:8000/install.sh | bash -s master 57 | ``` 58 | 59 | 3. When you see that "K8S master install finished!" remember the token output like this: " kubeadm join --token f8c407.9aa4bb840dfe2da0 192.168.0.10" 60 | 61 | ### Install K8S node 62 | 63 | To initialize a node & join the K8S cluster is simple: 64 | 65 | ```bash 66 | curl -L http://192.168.0.10:8000/install.sh | bash -s join --token=f8c407.9aa4bb840dfe2da0 192.168.0.10 67 | ``` 68 | 69 | Repeat this step if you want to setup multiple K8S nodes. 70 | 71 | ### Access the kubernetes dashboard 72 | 73 | ```http://(master or node IP):31234``` 74 | 75 | ## Offline installer for K8S 1.6 76 | 77 | __Kubernetes Version: 1.6.2__ 78 | 79 | Downlaod installer from 百度网盘: 80 | URL: [https://pan.baidu.com/s/1jIHu7H0](https://pan.baidu.com/s/1jIHu7H0) Code: 61b4 81 | 82 | Steps are the same with K8S 1.5, but you need to notice the differences: 83 | 84 | * Remember to reload the shell after master installation is completed: ```source ~/.bashrc``` 85 | * To install K8S node, don't forget the port: ```6443``` 86 | 87 | ```bash 88 | curl -L http://192.168.0.10:8000/install.sh | bash -s join --token=f8c407.9aa4bb840dfe2da0 192.168.0.10:6443 89 | ``` 90 | 91 | ## Offline installer for K8S 1.7 92 | 93 | __Kubernetes Version: 1.7.2__ 94 | 95 | Downlaod installer from 百度网盘: 96 | URL: [https://pan.baidu.com/s/1pLLUiSj](https://pan.baidu.com/s/1pLLUiSj) Code: ye2k 97 | 98 | Steps are the same with K8S 1.6. 99 | 100 | 101 | --------------------------------------------------------------------------------