Lawrence.


Kubernetes Notes


大部分内容皆来源于 Kubernetes 官网


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.3-0 kubelet-1.19.3-0 kubectl-1.19.3-0
kubeadm config images pull --image-repository [registry.aliyuncs.com/google_containers](http://registry.aliyuncs.com/google_containers) --kubernetes-version v1.19.3
kubeadm init --image-repository [registry.aliyuncs.com/google_containers](http://registry.aliyuncs.com/google_containers) --kubernetes-version v1.19.3 --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

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: bb
  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