Kubernetes是Google开源的容器引擎,由于单词很长,常常简称为k8s,8代表k和s之间有8个字母。k8s包含很多组件,用来对容器进行组织,可以对容器进行编排,自动管理容器的运行,实现滚动更新,进行负载均衡等。由于k8s集群搭建非常复杂,出现了很多部署k8s的工具,但是由于国内网络环境的问题,使用这些工具,我们依然很难获取到k8s搭建需要的镜像文件,因此需要采取一些手段来获取搭建环境需要的镜像。最近尝试了几次环境搭建,整理出了自己认为比较简单的一套环境搭建方式。硬件环境包括三台服务器(一台master和两台node),操作系统使用Ubuntu Server 18.04,部署的k8s版本是1.13.4。部署分为两部分,一部分是所有主机都要进行的操作,一些是master和node的不同配置。
1. ssh登录
2. 关闭防火墙
$ sudo ufw disable
3. 开启IPV4转发
$ sudo vim /etc/sysctl.conf
打开注释
net.ipv4.ip_forward = 1
使之生效
$ sudo sysctl -p
4. 禁止swap
$ sudo swapoff -a
$ sudo vim /etc/fstab
注释掉swap挂载
5. 配置iptables
$ sudo tee /etc/sysctl.d/k8s.conf <<-'EOF'
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system
6. 安装docker,使用阿里源
$ sudo apt-get remove docker docker-engine docker.io
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
$ sudo apt-get install -y docker-ce=18.06.1~ce~3-0~ubuntu
$ sudo systemctl enable docker && sudo systemctl start docker
$ sudo usermod -aG docker USERNAME
注意:上面的USERNAME替换为自己的用户名
7. 添加docker配置
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"iptables": false,
"ip-masq": false,
"storage-driver": "overlay2",
"graph": "/home/username/docker"
}
EOF
$ sudo systemctl restart docker
注意:graph字段的username替换为自己的用户名
8. 安装kubeadm,kubectl,kubelet,kubeadm是部署k8s的工具,kubectl是我们访问k8s集群的命令行工具,kubelet管理k8s中的容器
$ sudo apt-get update && sudo apt-get install -y apt-transport-https curl
$ sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
$ sudo apt-get update
$ sudo apt-get install -y kubelet=1.13.4-00 kubeadm=1.13.4-00 kubectl=1.13.4-00
$ sudo apt-mark hold kubelet=1.13.4-00 kubeadm=1.13.4-00 kubectl=1.13.4-00
$ sudo systemctl enable kubelet && sudo systemctl start kubelet
9. 下载必要的镜像,这里为了方便,我写在了.image_pull.sh脚本中,可以用来从其他源获取镜像,然后重新打tag
$ ./image_pull.sh
image_pull.sh内容如下
#!/bin/bash
images=(kube-proxy:v1.13.4 kube-scheduler:v1.13.4 kube-controller-manager:v1.13.4 kube-apiserver:v1.13.4 etcd:3.2.24 pause:3.1)
for imageName in ${images[@]} ; do
sudo docker pull mirrorgooglecontainers/$imageName
sudo docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName
sudo docker rmi mirrorgooglecontainers/$imageName
done
sudo docker pull carlziess/coredns-1.2.6
sudo docker tag carlziess/coredns-1.2.6:latest k8s.gcr.io/coredns:1.2.6
sudo docker rmi carlziess/coredns-1.2.6
sudo docker pull jmgao1983/flannel:v0.11.0-amd64
sudo docker tag jmgao1983/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64
sudo docker rmi jmgao1983/flannel:v0.11.0-amd64
注意:上面的镜像版本可以通过命令查看
sudo kubeadm config images list --kubernetes-version=v1.13.4
1. 初始化
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.13.4
2. 配置kubectl
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
3. 将master加入工作节点,默认master不会被作为工作节点在其上调度容器运行
$ kubectl taint nodes --all node-role.kubernetes.io/master-
4. 配置flannel,flannel是k8s支持的网络组件
$ sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
5. 生成永久token和秘钥,记录备用,默认生成的token存在有效期
$ kubeadm token create --ttl 0
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
1. node加入集群的命令
$ sudo kubeadm join MASTER_IP:6443 --token TOKEN --discovery-token-ca-cert-hash sha256:SHA256
注意:MASTER_IP替换为master服务器的IP,TOKEN和SHA256是上面master生成的
部署完成后,在master节点执行命令
$ sudo kubectl get po -n kube-system
如果发现所有的pod都处于Running状态,则集群搭建成功,否则按着上面步骤过一遍,看看是不是遗漏了什么。