【服务计算】Ubuntu 18.04上使用Kubeadm部署Kubernetes
Ubuntu 18.04上使用Kubeadm部署Kubernetes
Kubernetes定义
Kubernetes是一个容器编排系统,可大规模管理容器。 Kubernetes最初是由Google根据其在生产容器中运行容器的经验开发的,是开源的,并由世界各地的社区积极开发。
Kubeadm自动执行Kubernetes组件(例如API服务器,Controller Manager和Kube DNS)的安装和配置。 但是,它不会创建用户或处理操作系统级别的依存关系及其配置的安装。 对于这些初步任务,可以使用Ansible或SaltStack之类的配置管理工具。 使用这些工具可使创建更多群集或重新创建现有群集变得更加简单且不易出错。
集群资源
集群的物理资源包括:一个主节点和两个工作节点。主节点(Kubernetes中的一个节点指的是服务器)负责管理集群的状态。 它运行Etcd ,该文件在将工作负荷调度到工作节点的组件之间存储群集数据。 工作节点是将在其中运行工作负载 (即容器化的应用程序和服务)的服务器。 一旦分配了工作负载,工作人员将继续运行您的工作负载,即使主服务器在计划完成后关闭也是如此。 群集的容量可以通过添加工作程序来增加。
实验环境
操作系统: Ubuntu 18.04
内核:至少具有2GB RAM和2个vCPU
实验准备
添加国内镜像源
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
# 更新
sudo apt update
安装Ansible
增加源
sudo apt-add-repository ppa:ansible/ansible
更新源
sudo apt update
安装Ansible
sudo apt install ansible
关闭防火墙
ufw的底层是使用iptables进行数据过滤,建立在iptables之上,这可能会与 Docker 产生冲突,为避免不必要的麻烦,这里把firewalld关掉。Ubuntu默认未启用,则无需设置。
sudo ufw disable
若安装了selinux的话需要禁用。
临时禁用,重启后失效。
sudo setenforce 0
数据包转发
kube-proxy的ipvs模式和calico(都涉及路由转发)都需要主机开启ipv4转发。
sudo vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# 使命令生效
sudo sysctl -p
禁用swap
sudo swapoff -a
配置iptables参数
使得流经网桥的流量也经过iptables/netfilter防火墙。
$ 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
安装docker
首先,安装依赖。
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
添加docker的GPG key。
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
设置docker镜像源,这里选择使用阿里云镜像源,也可以换成其他国内镜像源来保证稳定。
$ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
安装docker-ce,可根据需要自己修改版本。
以下是18.06.1版本。
$ sudo apt-get install -y docker-ce=18.06.1~ce~3-0~ubuntu
启动并设置开机自启动docker。
$ sudo systemctl enable docker && sudo systemctl start docker
配置docker
配置启动参数:
- 设置阿里云镜像库加速dockerhub的镜像。
- 设置docker存储驱动为overlay2。
- 设置docker不再对podIP做
MASQUERADE
,否则docker会将podIP这个源地址SNAT成nodeIP。 - 禁用iptables。
- 根据业务规划修改容器实例存储根路径(默认路径是/var/lib/docker)。
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"],
"iptables": false,
"ip-masq": false,
"storage-driver": "overlay2",
"graph": "/home/lk/docker"
}
EOF
$ sudo systemctl restart docker
设置http代理
$ sudo mkdir /etc/systemd/system/docker.service.d
$ sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<-'EOF'
[Service]
Environment="HTTP_PROXY=http://xxx.xxx.xxx.xxx:xxxx"
Environment="NO_PROXY=localhost,127.0.0.0/8"
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
实验过程
安装依赖
需要安装kubeadm、kubelet、kubectl。
创建kubernetes的source文件:
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
sudo curl -s https://packages.cloud.google.com/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.12.0-00 kubeadm=1.12.0-00 kubectl=1.12.0-00
$ sudo apt-mark hold kubelet=1.12.0-00 kubeadm=1.12.0-00 kubectl=1.12.0-00
Kubernetes集群安装
下载镜像
docker pull anjia0532/google-containers.kube-apiserver:v1.12.0
docker pull anjia0532/google-containers.kube-controller-manager:v1.12.0
docker pull anjia0532/google-containers.kube-scheduler:v1.12.0
docker pull anjia0532/google-containers.kube-proxy:v1.12.0
docker pull anjia0532/google-containers.pause:3.1
docker pull anjia0532/google-containers.etcd:3.2.24
docker pull anjia0532/google-containers.coredns:1.2.2
设置回k8s.gcr.io镜像tag
docker tag anjia0532/google-containers.kube-apiserver:v1.12.0 k8s.gcr.io/kube-apiserver:v1.12.0
docker tag anjia0532/google-containers.kube-controller-manager:v1.12.0 k8s.gcr.io/kube-controller-manager:v1.12.0
docker tag anjia0532/google-containers.kube-scheduler:v1.12.0 k8s.gcr.io/kube-scheduler:v1.12.0
docker tag anjia0532/google-containers.kube-proxy:v1.12.0 k8s.gcr.io/kube-proxy:v1.12.0
docker tag anjia0532/google-containers.pause:3.1 k8s.gcr.io/pause:3.1
docker tag anjia0532/google-containers.etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
docker tag anjia0532/google-containers.coredns:1.2.2 k8s.gcr.io/coredns:1.2.2
初始化集群
命令行初始化:
sudo kubeadm init --apiserver-advertise-address=192.168.1.175 --pod-network-cidr=172.16.0.0/16 --service-cidr=10.233.0.0/16 --kubernetes-version=v1.12.0
部署成功的输出:
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
......
创建kubeconfig文件
新建文件夹,拷贝.conf文件。
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
设置工作负载
使用下面的命令去掉master的taint,使master参与工作负载。
$ kubectl taint nodes --all node-role.kubernetes.io/master-
node/lk-thinkpad-t470 untainted
网络部署
calico和其他k8s组件一样通过kube-apiserver与etcd进行交互,将数据存储在etcd中(通过CRD实现)。
创建rbac
kubectl apply -f release-v3.2.3/k8s-manifests/hosted/rbac-kdd.yaml
创建calico相关pod
kubectl apply -f release-v3.2.3/k8s-manifests/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
calico部署会同时部署cni插件以及calico组件两部分,而flannel的部署只会初始化一些cni的配置文件,并不会部署cni的可执行文件,需要手动部署。
CNI插件部署:
# 创建插件目录并进入目录下
sudo mkdir -p /opt/cni/bin
cd /opt/cni/bin
# 下载二进制文件
sudo wget https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-amd64-v0.7.1.tgz
# 解压安装
sudo tar -zxvf cni-plugins-amd64-v0.7.1.tgz
flannel部署:
下载yaml文件。
cd ~/kubeadm
wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
修改配置文件:
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
#添加下面这个toleration
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoSchedule
接着,下载镜像,再设置回原官方镜像的tag。
部署:
kubectl apply -f kube-flannel.yml
部署好后集群即可正常运行。
加入slave节点
使用如下命令加入节点:
kubeadm join 192.168.1.175:6443 --token w2ks3i.13l40j8ux38oz31r --discovery-token-ca-cert-hash sha256:387a9081b55dbed4263c22c9a8ffd5e7270c1bcdcca4299c2a69cba7d3df74e7
默认token的有效期为24小时,当过期之后,需要重新生成token。
kubeadm token generate
kubeadm token create <generated-token> --print-join-command --ttl=0