Kubernetes Notes

Kubernetes 中文概述(是什么以及不是什么)。

实践时建议使用 kubectl 自动补全,极大提升交互效率。

Pod

Pod 是比容器更高一层次的抽象,同一 Pod 中的所有容器共享

  • 同一网络 namespace
  • 存储

Controller

  • Deployment
  • ReplicaSet
  • DaemonSet
  • StatefulSet
  • Job

Service

是一个四层负载均衡器,为 Pod 提供负载均衡。

MiniKube

国内建议自定义镜像仓库,默认是 gcr.io ,似乎自带了 PV。

minikube start --vm-driver=none --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --cpus 4 --memory 6144

感觉 Docker Desktop 内置的 Kubernetes 有点类似这个 minikube (master 可以直接运行 Pod,也就是单节点集群)。当然了,它们都只能用于开发/测试环境。

Demo

用 Spring Boot 创建了一个 HTTP 服务端,可以尝试用 Kubernetes 部署它。

公网服务器集群初始化常用脚本

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubeadm-1.19.13-0 kubelet-1.19.13-0 kubectl-1.19.13-0
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.3
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.13 --apiserver-advertise-address $(hostname -i) --pod-network-cidr=10.96.0.0/16 --service-cidr=10.97.0.0/16
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

Flannel:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml](https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml)
kubectl apply -f kube-flannel.yaml

运行 Master 作为 Node:

kubectl taint node $HOSTNAME node-role.kubernetes.io/master-

恢复 Master 不可调度:

kubectl taint node $HOSTNAME node-role.kubernetes.io/master="":NoSchedule

重置:

kubeadm reset
systemctl stop kubelet
rm -rf /var/lib/cni/
rm -rf /var/lib/etcd/
rm -rf /var/lib/kubelet/
rm -rf /etc/cni/
rm -rf $HOME/.kube
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
systemctl restart kubelet
systemctl stop docker
systemctl restart docker

Pod 无法访问外网,尝试:

iptables -P FORWARD ACCEPT
iptables --flush
iptables -tnat --flush
 
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
// POD 无法访问外网络,但是可以互相 ping ping 宿主。CIDR POD CIDR
// 有可能是 SNAT 时出了问题,使用动态 SNAT (即 MASQUERADE) 来配置 nat 表路由规则:
iptables -t nat -I POSTROUTING -s 10.96.0.0/16 -j MASQUERADE
// 再尝试重新运行 core dns 服务

https://github.com/rancher/rancher/issues/6139

https://github.com/coredns/coredns/issues/2693

网络调试:使用 BusyBox:1.28.3,不建议使用 latest 镜像.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox
  namespace: default
  labels:
    app: busybox
spec:
  selector:
    matchLabels:
      app: busybox
  replicas: 1
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
        - name: busybox
          image: busybox:1.28.3
          command:
            - sleep
            - "3600"
          imagePullPolicy: IfNotPresent
      restartPolicy: Always

基于 DNS 的服务发现: Kubernetes Service / Pod 对象资源可以使用集群内部 FQDN 来访问,而不需要在意其扁平空间中的 Cluster IP。 Core DNS 会将 FQDN 动态地指向最新的 Cluster IP。参考 Pod 与 Service 的 DNS:

kubectl exec busybox -it -- nslookup kubernetes

返回内容:

Server:    10.97.0.10
Address 1: 10.97.0.10 kube-dns.kube-system.svc.cluster.local
 
Name:      kubernetes
Address 1: 10.97.0.1 kubernetes.default.svc.cluster.local