4 - ISCSI


一、iSCSI 命名约定

iSCSI 使用一种特殊、唯一的名称来标识 iSCSI 节点(目标或启动器)。此名称类似于与光纤通道设备相关联的全球名称 (WWN),可作为一种通用的节点识别方式使用。iSCSI 名称通过两种不同方式格式化。最常见的是 IQN 格式。有关 iSCSI 命名要求和字符串配置文件的更多详细信息,请参见 IETF 网站上的 RFC 3721 和 RFC 3722。

1、iSCSI 限定名 (IQN) 格式

IQN 格式采用 iqn.yyyy-mm.naming-authority:unique name 的形式,其中:

  • yyyy-mm 是命名机构成立的年份和月份。
  • naming-authority 通常是命名机构的 Internet 域名的反向语法。例如,iscsi.vmware.com 命名机构的 iSCSI 限定名形式可能是 iqn.1998-01.com.vmware.iscsi。此名称表示 vmware.com 域名于 1998 年 1 月注册,iscsi 是一个由 vmware.com 维护的子域。

  • unique name 是希望使用的任何名称,如主机的名称。命名机构必须确保在冒号后面分配的任何名称都是唯一的,例如:

iqn.1998-01.com.vmware.iscsi:name1

iqn.1998-01.com.vmware.iscsi:name2

iqn.1998-01.com.vmware.iscsi:name999

2、企业唯一标识符 (EUI) 格式

EUI 格式采用 eui.16 hex digits 的形式。例如,eui.0123456789ABCDEF。

16 位十六进制数字是 IEEE EUI(扩展唯一标识符)格式的 64 位数的文本表示形式。前 24 位是 IEEE 向特定公司注册的公司 ID。后 40 位由持有该公司 ID 的实体分配,并且必须是唯一的。

二、更新Kubernetes集群(可选)

Rancher安装的Kubernetes集群,利用iSCSI启动器工具在iSCSI卷上存储数据,该工具嵌入在kubelet的rancher/hyperkubeDocker镜像中。在某些情况下,安装在kubelet容器中的启动器和iscsi服务器版本可能不匹配,从而导致连接失败。

如果遇到此问题,可以将集群中每个节点上安装启动器工具,然后将启动器工具映射到kubelet容器来解决版本问题。

平台包裹名字安装命令
Ubuntu/Debianopen-iscsisudo apt install open-iscsi
RHELiscsi-initiator-utilsyum install iscsi-initiator-utils -y

在节点上安装启动器工具后,编辑集群YAML,编辑kubelet配置挂载主机SCSI二进制文件和配置目录,如下面的示例所示。

在更新Kubernetes YAML之前,请确保在集群节点上安装了open-iscsi(deb)或iscsi-initiator-utils(yum)软件包。如果在Kubernetes YAML中创建绑定挂载之前未安装此软件包,Docker将自动在每个节点上创建目录和文件。

  1. services:
  2. kubelet:
  3. extra_binds:
  4. - "/etc/iscsi:/etc/iscsi"
  5. - "/sbin/iscsiadm:/sbin/iscsiadm"

三、创建ISCSI服务器

1、操作系统以为centos7.6为例

主机名配置IP地址角色操作系统用户操作系统
iscsi-target-server2C4G1.1.1.47iSCSI Targetrootcentos
iscsi-target-agent-1.1.1.46iSCSI Initiatorrootcentos

注意:以上配置仅用于本次文档演示

2、iSCSI Target服务器搭建

  • 基础环境配置
  1. # 禁止selinux
  2. setenforce 0 # 临时禁止,重启后恢复
  3. sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久禁止,需要重启服务器
  4. # 关闭防火墙
  5. systemctl disable firewalld.service \
  6. && systemctl stop firewalld.service
  7. # 安装ntp时间同步服务器
  8. yum install ntp -y \
  9. && systemctl enable ntpd.service \
  10. && systemctl start ntpd.service
  • 安装iSCSI target管理工具
  1. yum targetcli.noarch -y \
  2. && systemctl enable target.service \
  3. && systemctl start target.service
  • 创建一个用于存放磁盘文件的目录,比如/iscsi_disks
  1. mkdir /iscsi_disks
  • 进入target管理命令行
  1. targetcli
  • 创建磁盘镜像

iscsi支持多种存储对象,可以通过ls /backstores/查看,这里演示选择文件存储fileio,如果用于生产建议选择块设备blockimage-20190502105823857

  1. # 创建磁盘镜像
  2. cd /backstores/fileio
  3. create disk01 /iscsi_disks/disk01.img 10G

image-20190502110142240

  • 创建target
  1. cd /iscsi
  2. create iqn.2019-05.com.example:servers1

image-20190502110728898

  • 创建LUN
  1. cd /iscsi/iqn.2019-05.com.example:servers1/tpg1/luns
  2. create /backstores/fileio/disk01

image-20190502110938378

  • (可选)配置ACL,限制哪些客户端能连接
  1. cd /iscsi/iqn.2019-05.com.example:servers1/tpg1/acls
  2. create iqn.2019-05.com.example:agent1

image-20190502111622579

  • 配置通信身份验证

    • 单向登录认证
  1. cd /iscsi/iqn.2019-05.com.example:servers1/tpg1/
  2. # 开启tpg1级别的登录认证
  3. set attribute authentication=1
  4. # 启用 read/write 模式
  5. set attribute demo_mode_write_protect=0
  6. set attribute generate_node_acls=1
  7. # 配置tpg1级别的登录认证
  8. set attribute authentication=1
  9. set auth userid=agent_login_user1 # 传入账号,也就是客户端访问服务端认证使用的账号
  10. set auth password=agent_login_passwd1 #传入账号对应的密码
  11. # 配置acls级别的登录认证
  12. cd /iscsi/iqn.2019-05.com.example:servers1/tpg1/acls/iqn.2019-05.com.example:agent1
  13. set auth userid=agent_login_user1 # 传入账号,也就是客户端访问服务端认证使用的账号
  14. set auth password=agent_login_passwd1 #传入账号对应的密码

image-20190502113817782

image-20190502113836685

  • 双向登录认证
  1. cd /iscsi/iqn.2019-05.com.example:servers1/tpg1/
  2. # 开启tpg1级别的登录认证
  3. set attribute authentication=1
  4. # 启用 read/write 模式
  5. set attribute demo_mode_write_protect=0
  6. set attribute generate_node_acls=1
  7. # 配置tpg1级别的登录认证
  8. set attribute authentication=1
  9. set auth userid=agent_login_user1 # 传入账号,客户端登录服务端用于校验的账号
  10. set auth password=agent_login_passwd1 # 传入账号对应的密码
  11. set auth mutual_userid=server_check_user1 # 传出账号,服务器用于验证客户端的账号
  12. set auth mutual_password=server_check_passwd1 # 传出账号对应的密码
  13. # 配置acls级别的登录认证
  14. cd /iscsi/iqn.2019-05.com.example:servers1/tpg1/acls/iqn.2019-05.com.example:agent1
  15. set auth userid=agent_login_user1 # 传入账号,客户端登录服务端用于校验的账号
  16. set auth password=agent_login_passwd1 # 传入账号对应的密码
  17. set auth mutual_userid=server_check_user1 # 传出账号,服务器用于验证客户端的账号
  18. set auth mutual_password=server_check_passwd1 # 传出账号对应的密码

image-20190502114449356

  • 单向发现认证
  1. cd /iscsi
  2. set discovery_auth enable=1
  3. set discovery_auth userid=agent_discovery_user2 # 传入账号,客户端发现服务端用于校验的账号
  4. set discovery_auth password=agent_discovery_passwd2 # 传入账号对应的密码

image-20190502114944156

  • 双向发现认证
  1. cd /iscsi
  2. set discovery_auth enable=1
  3. set discovery_auth userid=agent_discovery_user2 # 传入账号,客户端发现服务端用于校验的账号
  4. set discovery_auth password=agent_discovery_passwd2 # 传入账号对应的密码
  5. set discovery_auth mutual_userid=server_check_user2 # 传出账号,服务器用于验证客户端的账号
  6. set discovery_auth mutual_password=server_check_passwd2 # 传出账号对应的密码
  • 执行exit退出编辑并自动保存

image-20190502115342809

3、客户端校验

  • 基础环境配置
  1. # 禁止selinux
  2. setenforce 0 # 临时禁止,重启后恢复
  3. # 关闭防火墙
  4. systemctl disable firewalld.service \
  5. && systemctl stop firewalld.service
  6. # 安装ntp时间同步服务器
  7. yum install ntp -y \
  8. && systemctl enable ntpd.service \
  9. && systemctl start ntpd.service
  • 安装iscsi-initiator-utils工具
  1. yum install iscsi-initiator-utils -y
  • 配置客户端iqn
  1. vi /etc/iscsi/initiatorname.iscsi
  2. # 修改为之前ACL中创建的客户端iqn
  3. InitiatorName=iqn.2019-05.com.example:agent1
  • 配置客户端认证参数
  1. # 编辑配置文件
  2. vi /etc/iscsi/iscsid.conf
  3. # *************
  4. # CHAP Settings
  5. # *************
  6. # 开启登录认证方法
  7. node.session.auth.authmethod = CHAP
  8. # 登录认证
  9. ## 对应服务端的传入账号,客户端用此账号校验服务器
  10. node.session.auth.username = agent_login_user1
  11. node.session.auth.password = agent_login_passwd1
  12. # 双向登录认证
  13. ## 对应服务端的传出账号,服务器用此账号校验客户端
  14. node.session.auth.username_in = server_check_user1
  15. node.session.auth.password_in = server_check_passwd1
  16. # 开启发现认证方法
  17. discovery.sendtargets.auth.authmethod = CHAP
  18. # 单向发现认证
  19. # 对应服务端的传入账号,客户端用此账号发现服务器
  20. discovery.sendtargets.auth.username = agent_discovery_user2
  21. discovery.sendtargets.auth.password = agent_discovery_passwd2
  22. # 双向发现认证
  23. # 对应服务端的传出账号,服务器用此账号校验客户端
  24. discovery.sendtargets.auth.username_in = server_check_user2
  25. discovery.sendtargets.auth.password_in = server_check_passwd2
  26. # ********
  27. # Timeouts
  28. # ********
  • 发现测试
  1. iscsiadm -m discovery -t sendtargets -p 1.1.1.47

image-20190502121812570

  • 登录测试
  1. iscsiadm -m node -T iqn.2019-05.com.example:servers1 -p 1.1.1.47 -l

image-20190502123011786

四、配置K8S持久卷(PV)

1、创建密文

  • K8S中需要以为密文方式传入客户端的认证账号,并且需要base64加密
  1. ---
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5. name: chap-secret
  6. type: "kubernetes.io/iscsi-chap"
  7. data:
  8. discovery.sendtargets.auth.username: YWdlbnRfZGlzY292ZXJ5X3VzZXIyCg==
  9. discovery.sendtargets.auth.password: YWdlbnRfZGlzY292ZXJ5X3Bhc3N3ZDIK
  10. discovery.sendtargets.auth.username_in: c2VydmVyX2NoZWNrX3VzZXIyCg==
  11. discovery.sendtargets.auth.password_in: c2VydmVyX2NoZWNrX3Bhc3N3ZDIK
  12. node.session.auth.username: YWdlbnRfbG9naW5fdXNlcjEK
  13. node.session.auth.password: YWdlbnRfbG9naW5fcGFzc3dkMQo=
  14. node.session.auth.username_in: c2VydmVyX2NoZWNrX3VzZXIxCg==
  15. node.session.auth.password_in: c2VydmVyX2NoZWNrX3Bhc3N3ZDEK

参考地址:https://github.com/kubernetes/examples/blob/master/staging/volumes/iscsi/chap-secret.yaml

  • 登录到rancher ui,切换到任意项目(这里以default命名空间为例)\工作负载页面下,点击右上角的导入YAML按钮image-20190502130448080

  • 复制粘贴yaml内容,其他参数默认,最后点击导入image-20190502130555666

2、创建PV

  • 登录rancher ui,切换到指定集群\存储\持久卷,点击右上角的添加卷(pv);
  • image-20190502125012918
  • image-20190502130753062

3、创建测试应用

  • 切换到项目视图下,点击创建工作负载;
  • 配置应用的基本参数,image-20190502131153699
  • 配置容器卷,选择添加新的持久卷image-20190502131243542image-20190502125241993image-20190502131341819

  • 配置完成后点击启动。

  • 应用运行正常后,通过web shell查看磁盘挂载情况image-20190502133334778

  • 检查测试

查看target生成的镜像文件大小

image-20190502132810453

进入容器/demo路径下,通过dd命令写入一个文件

  1. dd if=/dev/zero of=/demo/demo count=2 bs=1024M

image-20190502132955690

image-20190502133046703