├── _config.yml ├── .gitignore ├── script ├── 05_deploy_flannel.sh ├── 04_config_kubectl.sh ├── 01_change_hostname.sh ├── 03_boot_master.sh ├── README.md ├── 02_install_kubeadm_ubuntu.sh └── 02_install_kubeadm_centos.sh ├── LICENSE └── README.md /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-leap-day -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # IDEs 2 | /.idea/ 3 | 4 | # temp files 5 | /temp/ -------------------------------------------------------------------------------- /script/05_deploy_flannel.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 部署 flannel 作为 CNI 4 | kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml -------------------------------------------------------------------------------- /script/04_config_kubectl.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 以一般用户运行下列命令,配置主节点所在实例的kubectl 4 | mkdir -p $HOME/.kube 5 | sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 6 | sudo chown $(id -u):$(id -g) $HOME/.kube/config -------------------------------------------------------------------------------- /script/01_change_hostname.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 将 master.localdomain 换为合适的值 3 | echo "master.localdomain" > /etc/hostname 4 | echo "127.0.0.1 master.localdomain" >> /etc/hosts 5 | echo "::1 master.localdomain" >> /etc/hosts 6 | # 不重启的情况下使修改生效 7 | sysctl kernel.hostname=master.localdomain -------------------------------------------------------------------------------- /script/03_boot_master.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Pass bridged IPv4 traffic to iptables’ chains. This is a requirement for some CNI plugins to work 3 | sysctl net.bridge.bridge-nf-call-iptables=1 4 | 5 | # flannel 要求指定该 pod-network-cidr 6 | # 指定 image-repository 以使用国内镜像 7 | kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers 8 | 9 | # 等待片刻,让系统准备好 10 | echo 'sleep a while for k8s to get ready...' 11 | sleep 15 -------------------------------------------------------------------------------- /script/README.md: -------------------------------------------------------------------------------- 1 | # 便利脚本 2 | 3 | 希望这个文件夹内的脚本能够为你的部署和实验工作提供一些便利,脚本已经编号,请按编号从小到大运行,每个编号只应该运行一次。 4 | 5 | 部分脚本(`01`, `02`, `03`)需要使用root权限运行: 6 | 7 | ```bash 8 | sudo bash ./script/03_boot_master.sh 9 | ``` 10 | 11 | 部分脚本(`04`, `05`)请使用一般用户权限运行: 12 | 13 | ```bash 14 | bash ./script/04_deploy_flannel.sh 15 | ``` 16 | 17 | 建议在使用脚本之前先通读项目根目录的`README.md`,避免翻车。 18 | 19 | 如果遇到问题,可以先查阅[常见问题和解决方案](https://github.com/nanmu42/k8s-by-kubeadm/issues?utf8=%E2%9C%93&q=label%3AQA+)。 20 | 21 | 注意:`script/01_change_hostname.sh`需要按你的实际需求做一些修改。 -------------------------------------------------------------------------------- /script/02_install_kubeadm_ubuntu.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 使用阿里云镜像 3 | apt-get update && apt-get install -y apt-transport-https 4 | curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 5 | cat </etc/apt/sources.list.d/kubernetes.list 6 | deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main 7 | EOF 8 | 9 | apt-get update 10 | apt-get install -y kubelet kubeadm kubectl 11 | apt-mark hold kubelet kubeadm kubectl 12 | 13 | # 配置命令自动完成 14 | echo "source <(kubectl completion bash)">> ~/.bashrc 15 | echo "source <(kubeadm completion bash)">> ~/.bashrc 16 | -------------------------------------------------------------------------------- /script/02_install_kubeadm_centos.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 使用阿里云镜像 3 | cat < /etc/yum.repos.d/kubernetes.repo 4 | [kubernetes] 5 | name=Kubernetes 6 | baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 7 | enabled=1 8 | gpgcheck=1 9 | repo_gpgcheck=1 10 | gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 11 | EOF 12 | setenforce 0 13 | yum install -y kubelet kubeadm kubectl 14 | systemctl enable kubelet && systemctl start kubelet 15 | 16 | # 配置命令自动完成 17 | echo "source <(kubectl completion bash)">> ~/.bashrc 18 | echo "source <(kubeadm completion bash)">> ~/.bashrc 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 LI Zhennan 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 | # k8s by kubeadm 国内网络环境搭建指南 2 | 3 | 本教程简要阐述了使用kubeadm在国内网络环境搭建单主k8s集群的方法。 4 | 5 | 欢迎各种形式的建议、勘误及贡献。 6 | 7 | Happy Hacking! 8 | 9 | # 开始搭建 10 | 11 | 本教程使用的大部分bash脚本可以在`script`文件夹中找到。 12 | 13 | 在使用脚本之前先通读本`README.md`,避免翻车。 14 | 15 | 如果遇到问题,可以先查阅[常见问题和解决方案](https://github.com/nanmu42/k8s-by-kubeadm/issues?utf8=%E2%9C%93&q=label%3AQA+)。 16 | 17 | ## 先决条件 18 | 19 | ### 实例 20 | 21 | * 一个或更多运行Ubuntu 16.04+/CentOS 7/Debian 9,2 GB以上内存,2核以上CPU的实例; 22 | * 实例之间有网络联通; 23 | * 确保每个实例有唯一的`hostname`, `MAC address`以及`product_uuid`(这个条件一般都能满足): 24 | 25 | ```bash 26 | # 查询MAC地址 27 | ip link 28 | 29 | # 查询 product_uuid 30 | sudo cat /sys/class/dmi/id/product_uuid 31 | ``` 32 | 33 | ### hostname 34 | 35 | k8s会使用实例的hostname作为节点名称,因此有必要为每个实例取一个描述性较好的名称。 36 | 37 | 实例的`hostname`需要满足[DNS-1123](https://tools.ietf.org/html/rfc1123)规范: 38 | 39 | * 字符集:数字、小写字母、`.`、`-` 40 | * 以小写字母开头和结尾 41 | 42 | 正则表达式为: 43 | 44 | ```regexp 45 | [a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)* 46 | ``` 47 | 48 | 修改`hostname`方式如下(`script/01_change_hostname.sh`): 49 | 50 | ```bash 51 | # 将 master.localdomain 换为合适的值 52 | echo "master.localdomain" > /etc/hostname 53 | echo "127.0.0.1 master.localdomain" >> /etc/hosts 54 | echo "::1 master.localdomain" >> /etc/hosts 55 | # 不重启的情况下使修改生效 56 | sysctl kernel.hostname=master.localdomain 57 | ``` 58 | 59 | ### 禁用Swap 60 | 61 | `kubelet`要求宿主实例的交换空间(Swap)禁用以正常工作。 62 | 63 | ```bash 64 | # 查看实例的swap设备 65 | # 如果没有输出,说明没有启用swap,可略过余下步骤 66 | cat /proc/swaps 67 | 68 | # 关闭swap 69 | swapoff -a 70 | 71 | # 清理相应的注册项 72 | nano /etc/fstab 73 | ``` 74 | 75 | ## 设置安全组 76 | 77 | 云上实例需要放行安全组中的下列指定TCP入方向(这里假设安全组的出方向TCP/UDP全部放行): 78 | 79 | * 主节点(Master) 80 | * 6443 81 | * 2379-2380 82 | * 10250-10252 83 | * 从节点(Worker) 84 | * 10250 85 | * 30000-32767 86 | 87 | 以上为Kubernetes本身需要开放的端口。 88 | 89 | **注意**,网络插件(CNI,容器网络接口)另有需要开放的端口,本教程使用Flannel(`vxlan`模式)作为CNI,需要额外放行下列入方向端口: 90 | 91 | * UDP 8472 92 | 93 | ## 安装容器运行时 94 | 95 | 本教程使用Docker作为容器运行时,请参阅[这里](https://docs.docker.com/v17.12/install/#server)进行安装。 96 | 97 | ## 安装kubeadm, kubelet 和 kubectl 98 | 99 | 由于一些原因,官方源无法在国内使用,这里使用国内镜像进行安装: 100 | 101 | * Ubuntu(`script/02_install_kubeadm_ubuntu.sh`) 102 | 103 | ```bash 104 | # 使用阿里云镜像 105 | apt-get update && apt-get install -y apt-transport-https 106 | curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 107 | cat </etc/apt/sources.list.d/kubernetes.list 108 | deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main 109 | EOF 110 | 111 | apt-get update 112 | apt-get install -y kubelet kubeadm kubectl 113 | apt-mark hold kubelet kubeadm kubectl 114 | 115 | # 配置命令自动完成 116 | echo "source <(kubectl completion bash)">> ~/.bashrc 117 | echo "source <(kubeadm completion bash)">> ~/.bashrc 118 | ``` 119 | 120 | * CentOS(`script/02_install_kubeadm_centos.sh`) 121 | 122 | ```bash 123 | # 使用阿里云镜像 124 | cat < /etc/yum.repos.d/kubernetes.repo 125 | [kubernetes] 126 | name=Kubernetes 127 | baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 128 | enabled=1 129 | gpgcheck=1 130 | repo_gpgcheck=1 131 | gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 132 | EOF 133 | setenforce 0 134 | yum install -y kubelet kubeadm kubectl 135 | systemctl enable kubelet && systemctl start kubelet 136 | 137 | # 配置命令自动完成 138 | echo "source <(kubectl completion bash)">> ~/.bashrc 139 | echo "source <(kubeadm completion bash)">> ~/.bashrc 140 | ``` 141 | 142 | ## 启动主节点,启动集群 143 | 144 | 选定一个实例作为主节点,运行下列命令(`script/03_boot_master.sh`): 145 | 146 | ```bash 147 | # Pass bridged IPv4 traffic to iptables’ chains. This is a requirement for some CNI plugins to work 148 | sysctl net.bridge.bridge-nf-call-iptables=1 149 | 150 | # flannel 要求指定该 pod-network-cidr 151 | # 指定 image-repository 以使用国内镜像 152 | kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers 153 | 154 | # 等待片刻,让系统准备好 155 | echo 'sleep a while for k8s to get ready...' 156 | sleep 15 157 | ``` 158 | 159 | 如果一切无误,kubeadm最后会有形如以下的输出: 160 | 161 | ``` 162 | kubeadm join 192.168.100.200:6443 --token some_token_here \ 163 | --discovery-token-ca-cert-hash sha256:some_hash_here 164 | ``` 165 | 166 | 记录上述输出,供从节点启动使用。 167 | 168 | 以一般用户运行下列命令,配置主节点所在实例的kubectl(`script/04_config_kubectl.sh`): 169 | 170 | ```bash 171 | mkdir -p $HOME/.kube 172 | sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 173 | sudo chown $(id -u):$(id -g) $HOME/.kube/config 174 | ``` 175 | 176 | ## 配置CNI 177 | 178 | 我们使用flannel作为CNI(`script/05_deploy_flannel.sh`): 179 | 180 | ```bash 181 | # 部署 flannel 作为 CNI 182 | kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml 183 | ``` 184 | 185 | ## (可选)让主节点也可以运行Pod 186 | 187 | Kubernetes默认不在主节点上运行Pod,这里可以让调度器不再遵从这个策略。 188 | 189 | 这会提高资源利用率,代价是会降低主节点的安全性。 190 | 191 | ```bash 192 | # (可选)让主节点上也能运行pod 193 | kubectl taint nodes --all node-role.kubernetes.io/master- 194 | ``` 195 | 196 | ## 启动从节点,加入集群 197 | 198 | 在要作为从节点加入集群的实例上,运行上个步骤kubeadm的输出的加入命令: 199 | 200 | ```bash 201 | kubeadm join 192.168.100.200:6443 --token some_token_here \ 202 | --discovery-token-ca-cert-hash sha256:some_hash_here 203 | ``` 204 | 205 | ## 检查节点状况 206 | 207 | ```bash 208 | $ kubectl get node 209 | ``` 210 | 211 | ``` 212 | NAME STATUS ROLES AGE VERSION 213 | master.localdomain Ready master 2m v1.14.0 214 | worker.localdomain Ready 2m v1.14.0 215 | ``` 216 | 217 | 如果列表中几个节点状态都为`Ready`,那么恭喜,你成功完成了本教程,部署了一个单主节点的k8s集群! 218 | 219 | ## 本教程的可执行脚本 220 | 221 | 可执行脚本在本仓库的`script`文件夹中,使用前请阅读`script/README.md`。 222 | 223 | ## 下一步? 224 | 225 | [官方文档](https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#optional-controlling-your-cluster-from-machines-other-than-the-master)是下一个不错的起点,祝你好运! 226 | 227 | # 参考文献/致谢 228 | 229 | * [阿里巴巴开源镜像站](https://opsx.alibaba.com/mirror) 230 | * https://kubernetes.io/docs/setup/independent/install-kubeadm/#check-required-ports 231 | * https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/ 232 | * https://serverfault.com/questions/684771/best-way-to-disable-swap-in-linux 233 | * https://github.com/coreos/flannel/blob/master/Documentation/backends.md#recommended-backends 234 | * https://blog.csdn.net/aixiaoyang168/article/details/78411511 235 | * https://zhuanlan.zhihu.com/p/46341911 236 | * https://kubernetes.feisky.xyz/ (很棒的学习资源) 237 | 238 | # License 239 | 240 | MIT License 241 | --------------------------------------------------------------------------------