经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
ansible一键部署k8s单机环境
来源:cnblogs  作者:Chen_linux  时间:2019/4/15 8:49:30  对本文有异议

一、虚拟机准备

干净的Centsot7.4、4G内存、2个CPU

最小化安装,最好带虚拟化

 

二、执行初始化脚本

注意:脚本中配置静态网卡根据实际网卡名称配置,我用的是ens33

可以用 sed -i "s/ens33/(实际网卡名)/g" 文件路径 进行替换

  1. #!/bin/bash
  2. echo "正在执行安装k8s环境初始化..."
  3. #关闭防火墙
  4. /usr/bin/iptables -F >/dev/null 2>&1
  5. /usr/bin/iptables -X >/dev/null 2>&1
  6. /usr/bin/systemctl disable firewalld.service >/dev/null 2>&1
  7. /usr/bin/systemctl stop firewalld.service >/dev/null 2>&1
  8. echo "执行关闭防火墙..."
  9. #禁用SELINUX
  10. /usr/sbin/setenforce 0
  11. /usr/bin/sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
  12. echo "执行关闭selinux..."
  13. #关闭swap
  14. /usr/sbin/swapoff -a
  15. echo "vm.swappiness = 0">> /etc/sysctl.conf
  16. echo "执行关闭swap..."
  17. #配置静态网络
  18. echo "配置静态网络..."
  19. cat << EOF >/etc/sysconfig/network-scripts/ifcfg-ens33
  20. TYPE="Ethernet"
  21. BOOTPROTO="static"
  22. IPADDR="`ifconfig ens33 | grep broadcast | awk -F " " '{print $2}'`"
  23. NETMASK="`ifconfig ens33 | grep broadcast | awk -F " " '{print $4}'`"
  24. GATREWAY="`route -n | grep UG | awk -F " " '{print$2}'`"
  25. NAME="ens33"
  26. DEVICE="ens33"
  27. ONBOOT="yes"
  28. PEERDNS="yes"
  29. DNS1="114.114.114.114"
  30. DNS2="8.8.8.8"
  31. DNS3="`route -n | grep UG | awk -F " " '{print$2}'`"
  32. EOF
  33. cat <<EOF >/etc/sysconfig/network
  34. GATEWAY=`route -n | grep UG | awk -F " " '{print$2}'`
  35. EOF
  36. #配置yum源
  37. cat << EOF >/etc/yum.repos.d/163.repo
  38. [163]
  39. name=163
  40. baseurl=http://mirrors.163.com/centos/7/os/x86_64/
  41. gpgcheck=0
  42. enable=1
  43. EOF
  44. cat << EOF >/etc/yum.repos.d/epel.repo
  45. [epel]
  46. name=epel
  47. baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
  48. enabled=1
  49. gpgcheck=0
  50. EOF
  51. echo "写入网络yum源..."
  52. #更新yum源
  53. yum clean all >/dev/null 2>&1
  54. yum makecache >/dev/null 2>&1
  55. echo "更新yum源..."
  56. #安装wget、ansible
  57. yum install -y wget >/dev/null 2>&1
  58. yum install -y ansible >/dev/null 2>&1
  59. echo "安装wget、ansible工具..."
  60. #定义ansible组
  61. cat << EOF >>/etc/ansible/hosts
  62. [k8s]
  63. `ifconfig ens33 | grep broadcast | awk -F " " '{print $2}'`
  64. EOF
  65. echo "配置ansible组..."
  66. #设置主机名
  67. echo -n "请输入主机名:"
  68. read -p "" name
  69. /usr/bin/hostnamectl --static set-hostname $name
  70. if [ $? = 0 ]
  71. then
  72. echo "修改主机名成功..."
  73. else
  74. echo "修改主机名失败..."
  75. exit
  76. fi
  77. echo "初始化完成..."
  78. echo "正在执行重启操作..."
  79. sleep 3
  80. /usr/sbin/init 6

 

三、执行ssh进行主机验证

ssh root@本机ip

若不执行,ansible执行会报错

 

四、ansible部署k8s环境准备

注意:shell脚本我统一放在/root/start-sh/目录下

mkdir -p /root/start-sh/

cd /root/start-sh/

vim docker-k8s.sh

创建docker-k8s.sh脚本,其内容是拉取k8s镜像

  1. #!/bin/bash
  2. #下载镜像
  3. docker pull mirrorgooglecontainers/kube-apiserver:v1.14.0
  4. docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.0
  5. docker pull mirrorgooglecontainers/kube-scheduler:v1.14.0
  6. docker pull mirrorgooglecontainers/kube-proxy:v1.14.0
  7. docker pull mirrorgooglecontainers/pause:3.1
  8. docker pull mirrorgooglecontainers/etcd:3.3.10
  9. docker pull coredns/coredns:1.3.1
  10. docker pull registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64
  11. #给镜像打tag
  12. docker tag mirrorgooglecontainers/kube-apiserver:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0
  13. docker tag mirrorgooglecontainers/kube-controller-manager:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0
  14. docker tag mirrorgooglecontainers/kube-scheduler:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0
  15. docker tag mirrorgooglecontainers/kube-proxy:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0
  16. docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
  17. docker tag mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
  18. docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
  19. docker tag registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
  20. #删除原镜像
  21. docker rmi mirrorgooglecontainers/kube-apiserver:v1.14.0
  22. docker rmi mirrorgooglecontainers/kube-controller-manager:v1.14.0
  23. docker rmi mirrorgooglecontainers/kube-scheduler:v1.14.0
  24. docker rmi mirrorgooglecontainers/kube-proxy:v1.14.0
  25. docker rmi mirrorgooglecontainers/pause:3.1
  26. docker rmi mirrorgooglecontainers/etcd:3.3.10
  27. docker rmi coredns/coredns:1.3.1
  28. docker rmi registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64

创建k8s目录,编写kube-flannel.yaml文件(参照https://www.codesheep.cn/kube-flannel-yml/?spm=a2c4e.11153940.blogcont682810.11.6f853974iYJ4BU

该内容目的是pod的网络通信

mkdir -p /root/kube-system/

cd /root/kube-system/

vim kube-flannel.yaml

  1. ---
  2. kind: ClusterRole
  3. apiVersion: rbac.authorization.k8s.io/v1beta1
  4. metadata:
  5. name: flannel
  6. rules:
  7. - apiGroups:
  8. - ""
  9. resources:
  10. - pods
  11. verbs:
  12. - get
  13. - apiGroups:
  14. - ""
  15. resources:
  16. - nodes
  17. verbs:
  18. - list
  19. - watch
  20. - apiGroups:
  21. - ""
  22. resources:
  23. - nodes/status
  24. verbs:
  25. - patch
  26. ---
  27. kind: ClusterRoleBinding
  28. apiVersion: rbac.authorization.k8s.io/v1beta1
  29. metadata:
  30. name: flannel
  31. roleRef:
  32. apiGroup: rbac.authorization.k8s.io
  33. kind: ClusterRole
  34. name: flannel
  35. subjects:
  36. - kind: ServiceAccount
  37. name: flannel
  38. namespace: kube-system
  39. ---
  40. apiVersion: v1
  41. kind: ServiceAccount
  42. metadata:
  43. name: flannel
  44. namespace: kube-system
  45. ---
  46. kind: ConfigMap
  47. apiVersion: v1
  48. metadata:
  49. name: kube-flannel-cfg
  50. namespace: kube-system
  51. labels:
  52. tier: node
  53. app: flannel
  54. data:
  55. cni-conf.json: |
  56. {
  57. "name": "cbr0",
  58. "plugins": [
  59. {
  60. "type": "flannel",
  61. "delegate": {
  62. "hairpinMode": true,
  63. "isDefaultGateway": true
  64. }
  65. },
  66. {
  67. "type": "portmap",
  68. "capabilities": {
  69. "portMappings": true
  70. }
  71. }
  72. ]
  73. }
  74. net-conf.json: |
  75. {
  76. "Network": "10.244.0.0/16",
  77. "Backend": {
  78. "Type": "vxlan"
  79. }
  80. }
  81. ---
  82. apiVersion: extensions/v1beta1
  83. kind: DaemonSet
  84. metadata:
  85. name: kube-flannel-ds-amd64
  86. namespace: kube-system
  87. labels:
  88. tier: node
  89. app: flannel
  90. spec:
  91. template:
  92. metadata:
  93. labels:
  94. tier: node
  95. app: flannel
  96. spec:
  97. hostNetwork: true
  98. nodeSelector:
  99. beta.kubernetes.io/arch: amd64
  100. tolerations:
  101. - operator: Exists
  102. effect: NoSchedule
  103. serviceAccountName: flannel
  104. initContainers:
  105. - name: install-cni
  106. image: quay.io/coreos/flannel:v0.10.0-amd64
  107. command:
  108. - cp
  109. args:
  110. - -f
  111. - /etc/kube-flannel/cni-conf.json
  112. - /etc/cni/net.d/10-flannel.conflist
  113. volumeMounts:
  114. - name: cni
  115. mountPath: /etc/cni/net.d
  116. - name: flannel-cfg
  117. mountPath: /etc/kube-flannel/
  118. containers:
  119. - name: kube-flannel
  120. image: quay.io/coreos/flannel:v0.10.0-amd64
  121. command:
  122. - /opt/bin/flanneld
  123. args:
  124. - --ip-masq
  125. - --kube-subnet-mgr
  126. resources:
  127. requests:
  128. cpu: "100m"
  129. memory: "50Mi"
  130. limits:
  131. cpu: "100m"
  132. memory: "50Mi"
  133. securityContext:
  134. privileged: true
  135. env:
  136. - name: POD_NAME
  137. valueFrom:
  138. fieldRef:
  139. fieldPath: metadata.name
  140. - name: POD_NAMESPACE
  141. valueFrom:
  142. fieldRef:
  143. fieldPath: metadata.namespace
  144. volumeMounts:
  145. - name: run
  146. mountPath: /run
  147. - name: flannel-cfg
  148. mountPath: /etc/kube-flannel/
  149. volumes:
  150. - name: run
  151. hostPath:
  152. path: /run
  153. - name: cni
  154. hostPath:
  155. path: /etc/cni/net.d
  156. - name: flannel-cfg
  157. configMap:
  158. name: kube-flannel-cfg
  159. ---
  160. apiVersion: extensions/v1beta1
  161. kind: DaemonSet
  162. metadata:
  163. name: kube-flannel-ds-arm64
  164. namespace: kube-system
  165. labels:
  166. tier: node
  167. app: flannel
  168. spec:
  169. template:
  170. metadata:
  171. labels:
  172. tier: node
  173. app: flannel
  174. spec:
  175. hostNetwork: true
  176. nodeSelector:
  177. beta.kubernetes.io/arch: arm64
  178. tolerations:
  179. - operator: Exists
  180. effect: NoSchedule
  181. serviceAccountName: flannel
  182. initContainers:
  183. - name: install-cni
  184. image: quay.io/coreos/flannel:v0.10.0-arm64
  185. command:
  186. - cp
  187. args:
  188. - -f
  189. - /etc/kube-flannel/cni-conf.json
  190. - /etc/cni/net.d/10-flannel.conflist
  191. volumeMounts:
  192. - name: cni
  193. mountPath: /etc/cni/net.d
  194. - name: flannel-cfg
  195. mountPath: /etc/kube-flannel/
  196. containers:
  197. - name: kube-flannel
  198. image: quay.io/coreos/flannel:v0.10.0-arm64
  199. command:
  200. - /opt/bin/flanneld
  201. args:
  202. - --ip-masq
  203. - --kube-subnet-mgr
  204. resources:
  205. requests:
  206. cpu: "100m"
  207. memory: "50Mi"
  208. limits:
  209. cpu: "100m"
  210. memory: "50Mi"
  211. securityContext:
  212. privileged: true
  213. env:
  214. - name: POD_NAME
  215. valueFrom:
  216. fieldRef:
  217. fieldPath: metadata.name
  218. - name: POD_NAMESPACE
  219. valueFrom:
  220. fieldRef:
  221. fieldPath: metadata.namespace
  222. volumeMounts:
  223. - name: run
  224. mountPath: /run
  225. - name: flannel-cfg
  226. mountPath: /etc/kube-flannel/
  227. volumes:
  228. - name: run
  229. hostPath:
  230. path: /run
  231. - name: cni
  232. hostPath:
  233. path: /etc/cni/net.d
  234. - name: flannel-cfg
  235. configMap:
  236. name: kube-flannel-cfg
  237. ---
  238. apiVersion: extensions/v1beta1
  239. kind: DaemonSet
  240. metadata:
  241. name: kube-flannel-ds-arm
  242. namespace: kube-system
  243. labels:
  244. tier: node
  245. app: flannel
  246. spec:
  247. template:
  248. metadata:
  249. labels:
  250. tier: node
  251. app: flannel
  252. spec:
  253. hostNetwork: true
  254. nodeSelector:
  255. beta.kubernetes.io/arch: arm
  256. tolerations:
  257. - operator: Exists
  258. effect: NoSchedule
  259. serviceAccountName: flannel
  260. initContainers:
  261. - name: install-cni
  262. image: quay.io/coreos/flannel:v0.10.0-arm
  263. command:
  264. - cp
  265. args:
  266. - -f
  267. - /etc/kube-flannel/cni-conf.json
  268. - /etc/cni/net.d/10-flannel.conflist
  269. volumeMounts:
  270. - name: cni
  271. mountPath: /etc/cni/net.d
  272. - name: flannel-cfg
  273. mountPath: /etc/kube-flannel/
  274. containers:
  275. - name: kube-flannel
  276. image: quay.io/coreos/flannel:v0.10.0-arm
  277. command:
  278. - /opt/bin/flanneld
  279. args:
  280. - --ip-masq
  281. - --kube-subnet-mgr
  282. resources:
  283. requests:
  284. cpu: "100m"
  285. memory: "50Mi"
  286. limits:
  287. cpu: "100m"
  288. memory: "50Mi"
  289. securityContext:
  290. privileged: true
  291. env:
  292. - name: POD_NAME
  293. valueFrom:
  294. fieldRef:
  295. fieldPath: metadata.name
  296. - name: POD_NAMESPACE
  297. valueFrom:
  298. fieldRef:
  299. fieldPath: metadata.namespace
  300. volumeMounts:
  301. - name: run
  302. mountPath: /run
  303. - name: flannel-cfg
  304. mountPath: /etc/kube-flannel/
  305. volumes:
  306. - name: run
  307. hostPath:
  308. path: /run
  309. - name: cni
  310. hostPath:
  311. path: /etc/cni/net.d
  312. - name: flannel-cfg
  313. configMap:
  314. name: kube-flannel-cfg
  315. ---
  316. apiVersion: extensions/v1beta1
  317. kind: DaemonSet
  318. metadata:
  319. name: kube-flannel-ds-ppc64le
  320. namespace: kube-system
  321. labels:
  322. tier: node
  323. app: flannel
  324. spec:
  325. template:
  326. metadata:
  327. labels:
  328. tier: node
  329. app: flannel
  330. spec:
  331. hostNetwork: true
  332. nodeSelector:
  333. beta.kubernetes.io/arch: ppc64le
  334. tolerations:
  335. - operator: Exists
  336. effect: NoSchedule
  337. serviceAccountName: flannel
  338. initContainers:
  339. - name: install-cni
  340. image: quay.io/coreos/flannel:v0.10.0-ppc64le
  341. command:
  342. - cp
  343. args:
  344. - -f
  345. - /etc/kube-flannel/cni-conf.json
  346. - /etc/cni/net.d/10-flannel.conflist
  347. volumeMounts:
  348. - name: cni
  349. mountPath: /etc/cni/net.d
  350. - name: flannel-cfg
  351. mountPath: /etc/kube-flannel/
  352. containers:
  353. - name: kube-flannel
  354. image: quay.io/coreos/flannel:v0.10.0-ppc64le
  355. command:
  356. - /opt/bin/flanneld
  357. args:
  358. - --ip-masq
  359. - --kube-subnet-mgr
  360. resources:
  361. requests:
  362. cpu: "100m"
  363. memory: "50Mi"
  364. limits:
  365. cpu: "100m"
  366. memory: "50Mi"
  367. securityContext:
  368. privileged: true
  369. env:
  370. - name: POD_NAME
  371. valueFrom:
  372. fieldRef:
  373. fieldPath: metadata.name
  374. - name: POD_NAMESPACE
  375. valueFrom:
  376. fieldRef:
  377. fieldPath: metadata.namespace
  378. volumeMounts:
  379. - name: run
  380. mountPath: /run
  381. - name: flannel-cfg
  382. mountPath: /etc/kube-flannel/
  383. volumes:
  384. - name: run
  385. hostPath:
  386. path: /run
  387. - name: cni
  388. hostPath:
  389. path: /etc/cni/net.d
  390. - name: flannel-cfg
  391. configMap:
  392. name: kube-flannel-cfg
  393. ---
  394. apiVersion: extensions/v1beta1
  395. kind: DaemonSet
  396. metadata:
  397. name: kube-flannel-ds-s390x
  398. namespace: kube-system
  399. labels:
  400. tier: node
  401. app: flannel
  402. spec:
  403. template:
  404. metadata:
  405. labels:
  406. tier: node
  407. app: flannel
  408. spec:
  409. hostNetwork: true
  410. nodeSelector:
  411. beta.kubernetes.io/arch: s390x
  412. tolerations:
  413. - operator: Exists
  414. effect: NoSchedule
  415. serviceAccountName: flannel
  416. initContainers:
  417. - name: install-cni
  418. image: quay.io/coreos/flannel:v0.10.0-s390x
  419. command:
  420. - cp
  421. args:
  422. - -f
  423. - /etc/kube-flannel/cni-conf.json
  424. - /etc/cni/net.d/10-flannel.conflist
  425. volumeMounts:
  426. - name: cni
  427. mountPath: /etc/cni/net.d
  428. - name: flannel-cfg
  429. mountPath: /etc/kube-flannel/
  430. containers:
  431. - name: kube-flannel
  432. image: quay.io/coreos/flannel:v0.10.0-s390x
  433. command:
  434. - /opt/bin/flanneld
  435. args:
  436. - --ip-masq
  437. - --kube-subnet-mgr
  438. resources:
  439. requests:
  440. cpu: "100m"
  441. memory: "50Mi"
  442. limits:
  443. cpu: "100m"
  444. memory: "50Mi"
  445. securityContext:
  446. privileged: true
  447. env:
  448. - name: POD_NAME
  449. valueFrom:
  450. fieldRef:
  451. fieldPath: metadata.name
  452. - name: POD_NAMESPACE
  453. valueFrom:
  454. fieldRef:
  455. fieldPath: metadata.namespace
  456. volumeMounts:
  457. - name: run
  458. mountPath: /run
  459. - name: flannel-cfg
  460. mountPath: /etc/kube-flannel/
  461. volumes:
  462. - name: run
  463. hostPath:
  464. path: /run
  465. - name: cni
  466. hostPath:
  467. path: /etc/cni/net.d
  468. - name: flannel-cfg
  469. configMap:
  470. name: kube-flannel-cfg

yaml文件建好后使用一个脚本启动它

cd /root/start-sh/

vim start-pod-network

  1. #!/bin/bash
  2. #设置kubectl
  3. echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
  4. source /etc/profile
  5. #安装pod network
  6. /usr/sbin/sysctl net.bridge.bridge-nf-call-iptables=1
  7. kubectl apply -f /root/k8s/kube-system/kube-flannel.yaml

准备好k8s需要的环境文件后编写ansible剧本

mkdir -p /root/asnible

cd /root/ansible

vim k8s.yml

注意:init k8s我使用了一个awk获取本地ip也是根据ens33网卡

  1. ---
  2. - hosts: k8s
  3. remote_user: root
  4. tasks:
  5. - name: off iptables
  6. shell: iptables -F && iptables -X
  7. - name: wget CentOS-Base.repo
  8. shell: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  9. - name: update CentOS-Base.repo
  10. shell: sed -i "s/[$]releasever/7/g" /etc/yum.repos.d/CentOS-Base.repo
  11. - name: k8s.repo
  12. shell: echo -e [kubernetes]"\n"name=Kubernetes Repo"\n"baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/"\n"gpgcheck=0"\n"gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg >/etc/yum.repos.d/k8s.repo
  13. - name: wget docker-ce.repo
  14. shell: wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker.repo
  15. - name: yum makecache
  16. shell: yum clean all && yum makecache
  17. - name: install epel-release
  18. yum: name=epel-release state=present
  19. - name: install container-selinux
  20. yum: name=container-selinux state=present
  21. - name: install docker
  22. yum: name=docker state=present
  23. - name: update docker-selinux
  24. shell: sed -i "s/OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'/OPTIONS='--log-driver=journald --signature-verification=false'/g" /etc/sysconfig/docker
  25. - name: start docker
  26. service: name=docker enabled=yes state=restarted
  27. - name: install kubelet
  28. yum: name=kubelet state=present
  29. - name: install kubeadm
  30. yum: name=kubeadm state=present
  31. - name: install kubectl
  32. yum: name=kubectl state=present
  33. - name: start kubelet
  34. service: name=kubelet enabled=yes state=restarted
  35. - name: pull k8s iso
  36. shell: bash /root/start-sh/docker-k8s.sh
  37. - name: off swap
  38. shell: swapoff -a
  39. - name: init k8s
  40. ignore_errors: yes
  41. shell: kubeadm init --kubernetes-version=v1.14.0 --apiserver-advertise-address `ifconfig ens33 | grep broadcast | awk -F " " '{print $2}'` --pod-network-cidr=10.244.0.0/16
  42. - name: install pod network
  43. script: /root/start-sh/start-pod-network.sh
  44. - name: source kubcetl
  45. shell: source /etc/profile

 

五、执行ansible一键部署

cd /root/ansible/

ansible-playbook k8s.yml --ask-pass

输入密码

开始执行中,过程会有些慢,因为需拉取镜像

 

六、验证pod是否正常

完成后执行 kubectl get pod -n kube-system查看pod状态

若输入命令无效,再执行一次source /etc/profile

k8s环境部署好了

 

------------------------------------------------------------------------------------------------------------------------------------

技术不足望多见谅,若ansible有更好的优化方式可以留言交流

谢谢,祝工作顺利,身体健康

原文链接:http://www.cnblogs.com/linux-cbr/p/10694767.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号