Fork me on GitHub

K8s 学习笔记

K8s 学习笔记

上篇K8s 入门笔记第一部分讲的是 K8s 的部分名词,第二部分讲解的是 docker 技术,而 k8s 其实是一种容器编排工具(远不止此),是作为 docker 技术的上层建筑而定位的。

核心名词补充(参考下文 K8s 的架构辅助理解):

  1. 控制节点,master 节点。有三个组件(kube-apiserver、kube-scheduler、kube-controller-manager)分别负责API 服务、调度、容器编排等三项功能。
  2. 计算节点,Node 节点。

其他名词还是参考K8s 入门笔记中的第一部分。

K8s 的全局架构:

  1. 场景:一个 Web 容器,一个 DB 容器,两个容器运行在两个不同的机器上,对于一个容器而言,它的 IP 地址信息是不固定的,所以 Web 容器如何找到 DB 容器的 Pod 呢?
    1. K8s 给 Pod 绑定了一个 Service 服务,比如 DB 容器所在的 Pod 就有一个对应的 Service,这个 Service 对外暴露一个固定的网络地址,使外界可以找到此 Service。当 Pod 的 IP 地址等信息发生变化时,由 K8s 完成此信息的维护。

一键部署 k8s的实践

参考自 K8s 官网教程、极客时间出品的《深入剖析Kubernetes》第 10、11 讲

1. 手动安装 kubeadm(因为 kubelet需要上帝视角,不能通过 docker 安装)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
## CentOS 系统
## 1. 使用 k8s 国内源
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

## 2. 确定关闭 SElinux,因为 kubelet 目前不支持 SElinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

## 3. 安装 kubelet kubeadm kubectl
yum install -y kubelet-1.11.3-0.x86_64 kubeadm-1.11.3-0.x86_64 kubectl-1.11.3-0.x86_64 --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet

## 4. sysctl 配置中 net.bridge.bridge-nf-call-iptables 设为1
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

在第 3 步可能会报关于 kubernetes-cmi 的错误,参考链接:kubeadm1.10安装缺少包:kubernetes-cmi = 0.6.0

安装 kubernetes-cmi 后,再将过高版本的 kubelet 卸掉,重新安装低版本。

1
2
3
4
5
6
7
8
9
10
11
$ kubelet --version // 查看当前版本
Kubernetes v1.15.0
$ yum remove -y kubelet-1.15.0
...
Complete!
$ yum install -y kubelet-1.11.3-0.x86_64 --disableexcludes=kubernetes
...
Complete!
$ kubelet --version // 查看重装后的版本
Kubernetes v1.11.3

2. 部署 master 结点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#  Kubernetes master 的 init 全过程
## 1. 新增配置文件 kubeadm.yaml,说明:使用的是 kubelet-1.11.3
apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
controllerManagerExtraArgs:
horizontal-pod-autoscaler-use-rest-clients: "true"
horizontal-pod-autoscaler-sync-period: "10s"
node-monitor-grace-period: "10s"
apiServerExtraArgs:
runtime-config: "api/all=true"
kubernetesVersion: "v1.11.1"

## 2. 执行 init 操作
kubeadm init --config kubeadm.yaml

## 2.1 init 可能会失败,因为国内不好获取 gcr.io 镜像,所以使用以下命令。pull 成功了可再次尝试 2# 中命令
docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.11.1
docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.11.1
docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.11.1
docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.11.1
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd-amd64:3.2.18
docker pull coredns/coredns:1.1.3

docker tag docker.io/mirrorgooglecontainers/kube-proxy-amd64:v1.11.1 k8s.gcr.io/kube-proxy-amd64:v1.11.1
docker tag docker.io/mirrorgooglecontainers/kube-scheduler-amd64:v1.11.1 k8s.gcr.io/kube-scheduler-amd64:v1.11.1
docker tag docker.io/mirrorgooglecontainers/kube-apiserver-amd64:v1.11.1 k8s.gcr.io/kube-apiserver-amd64:v1.11.1
docker tag docker.io/mirrorgooglecontainers/kube-controller-manager-amd64:v1.11.1 k8s.gcr.io/kube-controller-manager-amd64:v1.11.1
docker tag docker.io/mirrorgooglecontainers/etcd-amd64:3.2.18 k8s.gcr.io/etcd-amd64:3.2.18
docker tag docker.io/mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag docker.io/coredns/coredns:1.1.3 k8s.gcr.io/coredns:1.1.3

## 2.2 init 后会拿到一个指令(kubeadm join 指令,用于 master 增加 worker),记下来,worker 结点添加时会用到
kubeadm join 172.17.0.2:6443 --token 7f4nt1.gimuf5n1g76twyca --discovery-token-ca-cert-hash sha256:d2d3cedb006a27fce293f3d1f1611c9cc0e0ae68c13f256dc0b1c2c49d8cf20b

## 2.3 第一次使用 k8s 集群要执行以下命令,这是将安全配置文件cp 到当前用户的.kube 目录下,kubectl会通过此路径下的安全文件访问k8s 集群
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

## 3.-2 执行get 命令,查看 Pod 状态,可以发现master 结点是 notReady
kubectl get nodes

## 3.-1 执行以下命令,查看 Pod 详细信息,发现 Conditions 下,造成 Ready False 的原因是 network plugin is not ready:
kubectl describe node master

## 3.0 为了解决 master 的 ready 问题,需要部署网络插件,部署完成后,master 就会变成 ready 状态
kubectl apply -f https://git.io/weave-kube-1.6

## 3.1 也可以通过以下命令查看所有 pods 的 status,可以看出多了一个名为weave-net-* 的 pods
kubectl get pods -n kube-system

3. 部署 worker 结点

  1. 在 worker 机器上重复以上”手动安装 kubeadm”中的全部步骤

  2. 执行 2.2 中的 kubeadm join 之前保存好的命令

  3. 如果 token 丢了或者不记得了,可以在 master 结点上执行以下命令重新生成 token

    1
    2
    kubeadm token generate
    kubeadm token create <generated-token> --print-join-command --ttl=0
  4. 搞定

-------------The End-------------