3. k8s cephfs 在 deployment.yaml 中的使用

3.1. Environment

k8s-master 192.168.31.120 km master
k8s-node1 192.168.31.119 kn1 node1
k8s-node2 192.168.31.118 kn2 node2

3.2. 配置 deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
        name: cephfs-provisioner
spec:
        replicas: 1
        strategy:
                type: Recreate
        template:
                metadata:
                        labels:
                                app: cephfs-provisioner
                spec:
                        containers:
                        - name: cephfs-provisioner
                                image: "quay.io/external_storage/cephfs-provisioner:latest" # 对应 镜像
                                imagePullPolicy: IfNotPresent
                                env:
                                - name: PROVISIONER_NAME
                                        valueFrom:
                                                configMapKeyRef:
                                                        key: provisioner.name
                                                        name: cephfs-provisioner
                                command: # 这里对应 命令
                                        - "/usr/local/bin/cephfs-provisioner"
                                args: # 这里对应三个参数
                                        - "-id=cephfs-provisioner-1"
                                        - "-master=https://10.96.0.1/"
                                        - "-kubeconfig=/kube/admin.conf"
                                volumeMounts: # 对应 -v
                                        - mountPath: /kube
                                                name: kube-config
                                        - mountPath: /var/run/kubernetes
                                                name: kube-run-env
                        volumes:
                        - name: kube-config
                                hostPath:
                                        # directory location on host
                                        path: /home/jlch
                                        # this field is optional
                                        type: Directory
                        - name: kube-run-env
                                hostPath:
                                        # directory location on host
                                        path: /var/run/kubernetes
                                        # this field is optional
                                        type: Directory

对应于

方法1 docker

docker run -ti -v  /home/jlch:/kube -v /var/run/kubernetes:/var/run/kubernetes --privileged --net=host  quay.io/external_storage/cephfs-provisioner /usr/local/bin/cephfs-provisioner -master=https://10.96.0.1/  -kubeconfig=/kube/admin.conf -id=cephfs-provisioner-1

3.3. apply

jlch@km:~/cephfs$ k apply -f deployment.yaml
deployment "cephfs-provisioner" created
jlch@km:~/cephfs$ k get pods
NAME                                READY     STATUS              RESTARTS   AGE
cephfs-provisioner-cff8d95c-8b498   0/1       ContainerCreating   0          3s

3.4. describe

报错了

jlch@km:~/cephfs$ k describe pod cephfs-provisioner-cff8d95c-8b498
Name:           cephfs-provisioner-cff8d95c-8b498
Namespace:      default
Node:           kn1/192.168.31.119
Start Time:     Fri, 24 Nov 2017 11:13:06 +0800
Labels:         app=cephfs-provisioner
                pod-template-hash=79948517
Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"default","name":"cephfs-provisioner-cff8d95c","uid":"645fa2f3-d0c5-11e7-85d4-000c...
Status:         Pending
IP:
Created By:     ReplicaSet/cephfs-provisioner-cff8d95c
Controlled By:  ReplicaSet/cephfs-provisioner-cff8d95c
Containers:
cephfs-provisioner:
    Container ID:
    Image:         quay.io/external_storage/cephfs-provisioner:latest
    Image ID:
    Port:          <none>
    Command:
    /usr/local/bin/cephfs-provisioner
    Args:
    -id=cephfs-provisioner-1
    -master=https://10.96.0.1/
    -kubeconfig=/kube/admin.conf
    State:          Waiting
    Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Environment:
    PROVISIONER_NAME:  <set to the key 'provisioner.name' of config map 'cephfs-provisioner'>  Optional: false
    Mounts:
    /kube from kube-config (rw)
    /var/run/kubernetes from kube-run-env (rw)
    /var/run/secrets/kubernetes.io/serviceaccount from default-token-np6qz (ro)
Conditions:
Type           Status
Initialized    True
Ready          False
PodScheduled   True
Volumes:
kube-config:
    Type:  HostPath (bare host directory volume)
    Path:  /home/jlch
kube-run-env:
    Type:  HostPath (bare host directory volume)
    Path:  /var/run/kubernetes
default-token-np6qz:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-np6qz
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.alpha.kubernetes.io/notReady:NoExecute for 300s
                node.alpha.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type     Reason                  Age                From               Message
----     ------                  ----               ----               -------
Normal   Scheduled               20s                default-scheduler  Successfully assigned cephfs-provisioner-cff8d95c-8b498 to kn1
Normal   SuccessfulMountVolume   19s                kubelet, kn1       MountVolume.SetUp succeeded for volume "kube-run-env"
Normal   SuccessfulMountVolume   19s                kubelet, kn1       MountVolume.SetUp succeeded for volume "kube-config"
Normal   SuccessfulMountVolume   19s                kubelet, kn1       MountVolume.SetUp succeeded for volume "default-token-np6qz"
Warning  FailedCreatePodSandBox  12s (x7 over 18s)  kubelet, kn1       Failed create pod sandbox.
Warning  FailedSync              11s (x8 over 18s)  kubelet, kn1       Error syncing pod
Normal   SandboxChanged          11s (x7 over 17s)  kubelet, kn1       Pod sandbox changed, it will be killed and re-created.
jlch@km:~/cephfs$

看到了吧。是 部署在 kn1 上的时候,报出 Failed create pod sandbox. 错误来了。 那就要去 kn1 上查看日志了。

root@kn1:~# vi /var/log/syslog
...
# 查找 ceph
Nov 24 09:09:19 kn1 systemd-udevd[23014]: Could not generate persistent MAC address for vethf620eecc: No such file or directory
Nov 24 09:09:19 kn1 kubelet[6008]: E1124 09:09:19.678998    6008 cni.go:301] Error adding network: "cni0" already has an IP address different from 10.244.1.1/24
Nov 24 09:09:19 kn1 kubelet[6008]: E1124 09:09:19.679048    6008 cni.go:250] Error while adding to cni network: "cni0" already has an IP address different from 10.244.1.1/24
Nov 24 09:09:19 kn1 kernel: [1788519.065714] cni0: port 1(vethf620eecc) entered disabled state
...

查找关键字 ceph, 找到了上面的信息,明显是与 cni0 相关。这上面讲了,”cni0” already has an IP address different from 10.244.1.1/24, 也就是说,可能现有已有一个cni0, 但是与kubernetes自动给它分配的ip: 10.244.1.1/24, 不一致了。 查一下ip,

root@kn1:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:6f:74:6a brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.119/24 brd 192.168.31.255 scope global ens160
    valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe6f:746a/64 scope link
    valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:96:2d:2c:25 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
    valid_lft forever preferred_lft forever
    inet6 fe80::42:96ff:fe2d:2c25/64 scope link
    valid_lft forever preferred_lft forever
4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    link/ether 9e:b7:c9:ed:7e:cb brd ff:ff:ff:ff:ff:ff
    inet 10.244.2.0/32 scope global flannel.1
    valid_lft forever preferred_lft forever
    inet6 fe80::9cb7:c9ff:feed:7ecb/64 scope link
    valid_lft forever preferred_lft forever
4639: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether 0a:58:0a:f4:02:01 brd ff:ff:ff:ff:ff:ff
    inet 10.244.2.1/24 scope global cni0
    valid_lft forever preferred_lft forever
    inet6 fe80::b401:beff:fedf:2203/64 scope link
    valid_lft forever preferred_lft forever
4640: veth3fec5211@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP group default
    link/ether 72:3c:c8:35:61:6f brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::703c:c8ff:fe35:616f/64 scope link
    valid_lft forever preferred_lft forever
root@kn1:~#

我去,果然是。这里面的是 10.244.2.1/24。我靠。 怎么办?怎么办? 修改cni0呗。

3.5. 修改 cni0

root@kn1:~# systemctl stop docker
root@kn1:~# ip a
root@kn1:~# brctl --help
root@kn1:~# brctl # 这里会提示怎么安装。
root@kn1:~# apt install bridge-utils
root@kn1:~# brctl --help
root@kn1:~# ifconfig cni0 down
root@kn1:~# brctl delbr cni0
root@kn1:~# ip a
root@kn1:~# systemctl start docker
root@kn1:~# ip a # 这个时候,docker 启动的 containers 会自动帮助把 cni0 启动起来的。

3.6. 检查

最后的效果

root@kn1:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:6f:74:6a brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.119/24 brd 192.168.31.255 scope global ens160
    valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe6f:746a/64 scope link
    valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:96:2d:2c:25 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
    valid_lft forever preferred_lft forever
    inet6 fe80::42:96ff:fe2d:2c25/64 scope link
    valid_lft forever preferred_lft forever
4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    link/ether ba:84:65:bb:4d:68 brd ff:ff:ff:ff:ff:ff
    inet 10.244.1.0/32 scope global flannel.1
    valid_lft forever preferred_lft forever
    inet6 fe80::b884:65ff:febb:4d68/64 scope link
    valid_lft forever preferred_lft forever
4639: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether 0a:58:0a:f4:01:01 brd ff:ff:ff:ff:ff:ff
    inet 10.244.1.1/24 scope global cni0
    valid_lft forever preferred_lft forever
    inet6 fe80::f48c:7eff:fecd:4e08/64 scope link
    valid_lft forever preferred_lft forever
4640: veth3fec5211@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP group default
    link/ether 72:3c:c8:35:61:6f brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::703c:c8ff:fe35:616f/64 scope link
    valid_lft forever preferred_lft forever
root@kn1:~#

好了,再回到 km ,检查 deployment,

jlch@km:~/cephfs$ k get pods
NAME                                READY     STATUS    RESTARTS   AGE
cephfs-provisioner-cff8d95c-6tgcs   1/1       Running   1          3h
jlch@km:~/cephfs$