k8s环境搭建

MAC上搭建k8s环境

使用minikube搭建单个接口的k8s环境

  • 安装虚拟机

    • macOS 可装 (Virtualbox、HyperKit、VMWare)
    • Linux 可装(VirtualBox、KVM)
    • Windows 可装(VirtualBox 或者 Hyper-V)
  • 安装kubectl命令行工具

    • wget https://dl.k8s.io/v1.10.7/kubernetes-client-linux-amd64.tar.gz
    • 安装minikube命令行工具
    • wget -O minikube https://github.com/kubernetes/minikube/releases/download/v0.28.2/minikube-linux-amd64
  • 运行minikube start命令

    • minikube start --registry-mirror=https://registry.docker-cn.com
  • 完成

    • kubectl cluster-info 查询集群状态
    • kubectl get nodes 获取集群节点信息

Dashboard k8s环境管理后台

  • minikube dashboard 打开Dashboard并通过浏览器查看集群相关状态。

  • minikube ssh 登录到Minikube VM从内部探索它,可以查看进程,容器镜像等。

Centos上搭建k8s环境

前期准备

  • 禁用swap,因为当某个 Pod 达到内存限制的时候,它可能会溢出到 swap 中,这会导致 K8S 无法正常进行调度。因为启动kubectl时要禁用swap

    sudo cat /proc/swaps # 验证 swap 配置的设备和文件。
    swapoff -a # 关闭 swap
    free # 查询swap状态
    
  • sudo cat /sys/class/dmi/id/product_uuid集群的这个product_uuid必须唯一,MAC地址也不能相同

  • sudo netstat -ntlp |grep -E '6443|23[79,80]|1025[0,1,2]’ 查询端口是否占用,k8s是一个C/S架构

  • 安装docker(18.03)

安装kubectl

curl -sSL https://dl.k8s.io/release/stable.txt # 查看当前kubectl稳定版本
curl -sSL https://dl.k8s.io/release/v1.15.3/bin/linux/amd64/kubeadm > /usr/bin/kubeadm # 下载kubeadm
chmod a+rx /usr/bin/kubeadm   ## 修改kubeadm权限可执行
kubeadm version  ## 查询kubeadm版本

## 或者下载源码安装
wget -q https://dl.k8s.io/v1.15.3/kubernetes-server-linux-amd64.tar.gz
tar -zxf kubernetes-server-linux-amd64.tar.gz
ls kubernetes/server/bin/ | grep -E 'kubeadm|kubelet|kubectl'
mv kubernetes/server/bin/kube{adm,ctl,let} /usr/bin/
kubeadm version, kubectl version --client, kubelet --version

配置kubelet

为了在生产环境中保障各组件的稳定运行,同时也为了便于管理,我们增加对 kubeletsystemd 的配置,由 systemd 对服务进行管理。

[root@master tmp]# cat <<'EOF' > /etc/systemd/system/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Agent
Documentation=http://kubernetes.io/docs/

[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF
[root@master tmp]# mkdir -p /etc/systemd/system/kubelet.service.d
[root@master tmp]# cat <<'EOF' > /etc/systemd/system/kubelet.service.d/kubeadm.conf
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
EOF
[root@master tmp]# systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /etc/systemd/system/kubelet.service.

在这里我们添加了 kubelet 的 systemd 配置,然后添加了它的 Drop-in 文件,我们增加的这个 kubeadm.conf 文件,会被 systemd 自动解析,用于复写 kubelet 的基础 systemd 配置,可以看到我们增加了一系列的配置参数

启动

启动之前还要装以下个软件

crictl 下载页面版本对应关系

  • crictlkubelet CRI (Container Runtime Interface) 的 CLI 。
  • critestkubelet CRI 的测试工具集。
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.15.0/crictl-v1.15.0-linux-amd64.tar.gz
echo 'c3b71be1f363e16078b51334967348aab4f72f46ef64a61fe7754e029779d45a crictl-v1.15.0-linux-amd64.tar.gz' | sha256sum  -c  # 验证加密串是否匹配
tar zxvf crictl-v1.11.1-linux-amd64.tar.gz
[root@master ~]# mv crictl /usr/bin/

socat是一款很强大的命令行工具,可以建立两个双向字节流并在其中传输数据

# centos
sudo yum install -y socat
#ubuntu
sudo apt-get install -y socat

最后执行下面命令即可完成安装,有问题直接google就可以解决

kubeadm init  # 初始化k8s集群

# 提示如下安装完成
Your Kubernetes control-plane 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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.10.32.58:6443 --token k1r0p3.r1zl71l72yeb9hza \
    --discovery-token-ca-cert-hash sha256:d7a1176311e952148c4dcbd14a0e0577625ef8dac37925482ce0e3f0946113b1

验证k8s环境搭建情况

kubectl cluster-info # 可查看集群 master 和集群服务的地址
kubectl get nodes -o yaml # 可查看集群中 Node 信息, -o 格式化输出
kubectl get pods --all-namespaces # 查询所有ns的所有pod
kubectl reset # 重置集群
kubeadm init --pod-network-cidr=10.244.0.0/16 # 初始化集群,携带网络配置参数

新增node到集群

首先将 /usr/bin/kubeadm/usr/bin/kubelet/usr/bin/kubectl拷贝到子节点上,然后直接下面命令,子节点也需要满足上面的基础条件

kubeadm join 10.10.32.58:6443 --token 1ryklq.n5s57orcorhr1qlc \
    --discovery-token-ca-cert-hash sha256:b8e722a3a4505f0e9d1642754790b281a81a54e42994be15754b716c12a5dc4f

遇到的问题

  • 遇到如下报错

/proc/sys/net/bridge/bridge-nf-call-iptables does not exist

执行 modprobe br_netfilter cat '1' > /proc/sys/net/bridge/bridge-nf-call-iptables 可解决

  • 如遇到k8s node notready

sudo journalctl -f -u kubelet查看k8s运行日志,一般是网络配置不对

sysctl net.bridge.bridge-nf-call-iptables=1
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 安装flannel
sudo kubectl apply -f kube-flannel.yml
# 再查看集群状态就ok了
kubectl get nodes

或者初始化的时候携带网络配置参数

kubeadm reset # 重置集群,包括子节点也会断开
kubeadm init --pod-network-cidr=10.244.0.0/16
# 注意flannel版本
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml