PCEtLXtzdWJ0ZW1wbGF0ZSBjb21tb24vaGVhZGVyX2NvbW1vbn0tLT4JPCEtLXtpZiAkX0dFVFsnbW9kJ10gPT0gJ3ZpZXd0aHJlYWQnICYmICFlbXB0eSgkX0dbJ3RpZCddKX0tLT4KCTxsaW5rIHJlbD0iY2Fub25pY2FsIiBocmVmPSJodHRwczovL3d3dy5xaWRhbzEyMy5jb20vYmJzL3RocmVhZC17JF9HWyd0aWQnXX0tMS0xLmh0bWwiIC8+Cgk8IS0te2Vsc2VpZiAkX0dFVFsnbW9kJ10gPT0gJ2ZvcnVtZGlzcGxheScgJiYgIWVtcHR5KCRfR1snZmlkJ10pfS0tPgoJPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Imh0dHBzOi8vd3d3LnFpZGFvMTIzLmNvbS9iYnMvZm9ydW0teyRfR1snZmlkJ119LTEuaHRtbCIgLz4KCTwhLS17ZWxzZWlmICRfR0VUWydtb2QnXSA9PSAnZ3VpZGUnfS0tPgoJPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Imh0dHBzOi8vd3d3LnFpZGFvMTIzLmNvbS9iYnMvZ3VpZGUvIiAvPgoJPCEtLXtlbHNlaWYgJF9HWydiYXNlc2NyaXB0J10gPT0gJ2ZvcnVtJyAmJiAoZW1wdHkoJF9HRVRbJ21vZCddKSB8fCAkX0dFVFsnbW9kJ10gPT0gJ2luZGV4Jyl9LS0+Cgk8bGluayByZWw9ImNhbm9uaWNhbCIgaHJlZj0iaHR0cHM6Ly93d3cucWlkYW8xMjMuY29tL2Jicy8iIC8+Cgk8IS0tey9pZn0tLT4KCXJgbmB0PG1ldGEgbmFtZT0iYXBwbGljYXRpb24tbmFtZSIgY29udGVudD0iJF9HWydzZXR0aW5nJ11bJ2JibmFtZSddIiAvPgoJPG1ldGEgbmFtZT0ibXNhcHBsaWNhdGlvbi10b29sdGlwIiBjb250ZW50PSIkX0dbJ3NldHRpbmcnXVsnYmJuYW1lJ10iIC8+Cgk8IS0te2lmICRfR1snc2V0dGluZyddWydwb3J0YWxzdGF0dXMnXX0tLT48bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVsxXVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ3BvcnRhbCddKSA/ICRfR1snc2NoZW1lJ10uJzovLycuJF9HWydzZXR0aW5nJ11bJ2RvbWFpbiddWydhcHAnXVsncG9ydGFsJ10gOiAkX0dbc2l0ZXVybF0uJ3BvcnRhbC5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L3BvcnRhbC5pY28iIC8+PCEtLXsvaWZ9LS0+Cgk8bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVsyXVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2ZvcnVtJ10pID8gJF9HWydzY2hlbWUnXS4nOi8vJy4kX0dbJ3NldHRpbmcnXVsnZG9tYWluJ11bJ2FwcCddWydmb3J1bSddIDogJF9HW3NpdGV1cmxdLidmb3J1bS5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L2Jicy5pY28iIC8+Cgk8IS0te2lmICRfR1snc2V0dGluZyddWydncm91cHN0YXR1cyddfS0tPjxtZXRhIG5hbWU9Im1zYXBwbGljYXRpb24tdGFzayIgY29udGVudD0ibmFtZT0kX0dbJ3NldHRpbmcnXVsnbmF2cyddWzNdWyduYXZuYW1lJ107YWN0aW9uLXVyaT17ZWNobyAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ2RvbWFpbiddWydhcHAnXVsnZ3JvdXAnXSkgPyAkX0dbJ3NjaGVtZSddLic6Ly8nLiRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2dyb3VwJ10gOiAkX0dbc2l0ZXVybF0uJ2dyb3VwLnBocCd9O2ljb24tdXJpPXskX0dbc2l0ZXVybF19e0lNR0RJUn0vZ3JvdXAuaWNvIiAvPjwhLS17L2lmfS0tPgoJPCEtLXtpZiBoZWxwZXJfYWNjZXNzOjpjaGVja19tb2R1bGUoJ2ZlZWQnKX0tLT48bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVs0XVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2hvbWUnXSkgPyAkX0dbJ3NjaGVtZSddLic6Ly8nLiRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2hvbWUnXSA6ICRfR1tzaXRldXJsXS4naG9tZS5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L2hvbWUuaWNvIiAvPjwhLS17L2lmfS0tPgoJPCEtLXtpZiAkX0dbJ2Jhc2VzY3JpcHQnXSA9PSAnZm9ydW0nICYmICRfR1snc2V0dGluZyddWydhcmNoaXZlciddfS0tPgoJCTxsaW5rIHJlbD0iYXJjaGl2ZXMiIHRpdGxlPSIkX0dbJ3NldHRpbmcnXVsnYmJuYW1lJ10iIGhyZWY9InskX0dbc2l0ZXVybF19YXJjaGl2ZXIvIiAvPgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICFlbXB0eSgkcnNzaGVhZCl9LS0+JHJzc2hlYWQ8IS0tey9pZn0tLT4KCTwhLS17aWYgd2lkdGhhdXRvKCl9LS0+CgkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBpZD0iY3NzX3dpZHRoYXV0byIgdHlwZT0idGV4dC9jc3MiIGhyZWY9J3skX0dbJ3NldHRpbmcnXVsnY3NzcGF0aCddfXtTVFlMRUlEfV93aWR0aGF1dG8uY3NzP3tWRVJIQVNIfScgLz4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+SFRNTE5PREUuY2xhc3NOYW1lICs9ICcgd2lkdGhhdXRvJzwvc2NyaXB0PgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICRfR1snYmFzZXNjcmlwdCddID09ICdmb3J1bScgfHwgJF9HWydiYXNlc2NyaXB0J10gPT0gJ2dyb3VwJ30tLT4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JF9HW3NldHRpbmddW2pzcGF0aF19Zm9ydW0uanM/e1ZFUkhBU0h9Ij48L3NjcmlwdD4KCTwhLS17ZWxzZWlmICRfR1snYmFzZXNjcmlwdCddID09ICdob21lJ30tLT4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JF9HW3NldHRpbmddW2pzcGF0aF19aG9tZS5qcz97VkVSSEFTSH0iPjwvc2NyaXB0PgoJPCEtLXtlbHNlaWYgJF9HWydiYXNlc2NyaXB0J10gPT0gJ3BvcnRhbCd9LS0+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ieyRfR1tzZXR0aW5nXVtqc3BhdGhdfXBvcnRhbC5qcz97VkVSSEFTSH0iPjwvc2NyaXB0PgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICRfR1snYmFzZXNjcmlwdCddICE9ICdwb3J0YWwnICYmICRfR0VUWydkaXknXSA9PSAneWVzJyAmJiBjaGVja19kaXlfcGVybSgkdG9waWMpfS0tPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InskX0dbc2V0dGluZ11banNwYXRoXX1wb3J0YWwuanM/e1ZFUkhBU0h9Ij48L3NjcmlwdD4KCTwhLS17L2lmfS0tPgoJPCEtLXtpZiAkX0dFVFsnZGl5J10gPT0gJ3llcycgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBpZD0iZGl5X2NvbW1vbiIgaHJlZj0ieyRfR1snc2V0dGluZyddWydjc3NwYXRoJ119e1NUWUxFSUR9X2Nzc19kaXkuY3NzP3tWRVJIQVNIfSIgLz4KCTwhLS17L2lmfS0tPgo8L2hlYWQ+Cgo8Ym9keSBpZD0ibnZfeyRfR1tiYXNlc2NyaXB0XX0iIGNsYXNzPSJwZ197Q1VSTU9EVUxFfXtpZiAkX0dbJ2Jhc2VzY3JpcHQnXSA9PT0gJ3BvcnRhbCcgJiYgQ1VSTU9EVUxFID09PSAnbGlzdCcgJiYgIWVtcHR5KCRjYXQpfSB7JGNhdFsnYm9keWNzcyddfXsvaWZ9IiBvbmtleWRvd249ImlmKGV2ZW50LmtleUNvZGU9PTI3KSByZXR1cm4gZmFsc2U7Ij4KCTxkaXYgaWQ9ImFwcGVuZF9wYXJlbnQiPjwvZGl2PjxkaXYgaWQ9ImFqYXh3YWl0aWQiPjwvZGl2PgoJPCEtLXtpZiAkX0dFVFsnZGl5J10gPT0gJ3llcycgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQk8IS0te3RlbXBsYXRlIGNvbW1vbi9oZWFkZXJfZGl5fS0tPgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmIGNoZWNrX2RpeV9wZXJtKCR0b3BpYyl9LS0+CgkJPCEtLXt0ZW1wbGF0ZSBjb21tb24vaGVhZGVyX2RpeW5hdn0tLT4KCTwhLS17L2lmfS0tPgoJPCEtLXtpZiBDVVJNT0RVTEUgPT0gJ3RvcGljJyAmJiAkdG9waWMgJiYgZW1wdHkoJHRvcGljWyd1c2VoZWFkZXInXSkgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQkkZGl5bmF2Cgk8IS0tey9pZn0tLT4KCTwhLS17aWYgZW1wdHkoJHRvcGljKSB8fCAkdG9waWNbJ3VzZWhlYWRlciddfS0tPgoJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ21vYmlsZSddWydhbGxvd21vYmlsZSddICYmICghJF9HWydzZXR0aW5nJ11bJ2NhY2hlaW5kZXhsaWZlJ10gJiYgISRfR1snc2V0dGluZyddWydjYWNoZXRocmVhZG9uJ10gfHwgJF9HWyd1aWQnXSkgJiYgKCRfR0VUWydkaXknXSAhPSAneWVzJyB8fCAhJF9HRVRbJ2luYWpheCddKSAmJiAoJF9HWydtb2JpbGUnXSAhPSAnJyAmJiAkX0dbJ2Nvb2tpZSddWydtb2JpbGUnXSA9PSAnJyAmJiAkX0dFVFsnbW9iaWxlJ10gIT0gJ25vJyl9LS0+CgkJCTxkaXYgY2xhc3M9InhpMSBibSBibV9jIj4KCQkJICAgIHtsYW5nIHlvdXJfbW9iaWxlX2Jyb3dzZXJ9PGEgaHJlZj0ieyRfR1snc2l0ZXVybCddfWZvcnVtLnBocD9tb2JpbGU9eWVzIj57bGFuZyBnb190b19tb2JpbGV9PC9hPiA8c3BhbiBjbGFzcz0ieGcxIj58PC9zcGFuPiA8YSBocmVmPSIkX0dbJ3NldHRpbmcnXVsnbW9iaWxlJ11bJ25vbW9iaWxldXJsJ10iPntsYW5nIHRvX2JlX2NvbnRpbnVlfTwvYT4KCQkJPC9kaXY+CgkJPCEtLXsvaWZ9LS0+CgkJPCEtLXtpZiAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ3Nob3J0Y3V0J10pICYmICRfR1snbWVtYmVyJ11bY3JlZGl0c10gPj0gJF9HWydzZXR0aW5nJ11bJ3Nob3J0Y3V0J119LS0+CgkJCTxkaXYgaWQ9InNob3J0Y3V0Ij4KCQkJCTxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InNob3J0Y3V0Y2xvc2VpZCIgdGl0bGU9IntsYW5nIGNsb3NlfSI+e2xhbmcgY2xvc2V9PC9hPjwvc3Bhbj4KCQkJCXtsYW5nIHNob3J0Y3V0X25vdGljZX0KCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InNob3J0Y3V0dGlwIj57bGFuZyBzaG9ydGN1dF9hZGR9PC9hPgoKCQkJPC9kaXY+CgkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5zZXRUaW1lb3V0KHNldFNob3J0Y3V0LCAyMDAwKTs8L3NjcmlwdD4KCQk8IS0tey9pZn0tLT4KCQk8ZGl2IGlkPSJ0b3B0YiIgY2xhc3M9ImNsIj4KCQkJPCEtLXtob29rL2dsb2JhbF9jcG5hdl90b3B9LS0+CgkJCTxkaXYgY2xhc3M9IndwIj4KCQkJCTxkaXYgY2xhc3M9InoiPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3NldHRpbmcnXVsndG9wbmF2cyddWzBdICRuYXZ9LS0+CgkJCQkJCTwhLS17aWYgaXNfYXJyYXkoJG5hdikgJiYgJG5hdlsnYXZhaWxhYmxlJ10gJiYgKCEkbmF2WydsZXZlbCddIHx8ICgkbmF2WydsZXZlbCddID09IDEgJiYgJF9HWyd1aWQnXSkgfHwgKCRuYXZbJ2xldmVsJ10gPT0gMiAmJiAkX0dbJ2FkbWluaWQnXSA+IDApIHx8ICgkbmF2WydsZXZlbCddID09IDMgJiYgJF9HWydhZG1pbmlkJ10gPT0gMSkpfS0tPiRuYXZbY29kZV08IS0tey9pZn0tLT4KCQkJCQk8IS0tey9sb29wfS0tPgoJCQkJCTwhLS17aG9vay9nbG9iYWxfY3BuYXZfZXh0cmExfS0tPgoJCQkJPC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJ5Ij4KCQkJCQk8YSBpZD0ic3dpdGNoYmxpbmQiIGhyZWY9ImphdmFzY3JpcHQ6OyIgb25jbGljaz0idG9nZ2xlQmxpbmQodGhpcykiIHRpdGxlPSJ7bGFuZyBzd2l0Y2hfYmxpbmR9IiBjbGFzcz0ic3dpdGNoYmxpbmQiPjwvYT4KCQkJCQk8IS0te2hvb2svZ2xvYmFsX2NwbmF2X2V4dHJhMn0tLT4KCQkJCQk8IS0te2xvb3AgJF9HWydzZXR0aW5nJ11bJ3RvcG5hdnMnXVsxXSAkbmF2fS0tPgoJCQkJCQk8IS0te2lmIGlzX2FycmF5KCRuYXYpICYmICRuYXZbJ2F2YWlsYWJsZSddICYmICghJG5hdlsnbGV2ZWwnXSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAxICYmICRfR1sndWlkJ10pIHx8ICgkbmF2WydsZXZlbCddID09IDIgJiYgJF9HWydhZG1pbmlkJ10gPiAwKSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAzICYmICRfR1snYWRtaW5pZCddID09IDEpKX0tLT4kbmF2W2NvZGVdPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCQk8IS0te2lmIGVtcHR5KCRfR1snZGlzYWJsZWR3aWR0aGF1dG8nXSkgJiYgJF9HWydzZXR0aW5nJ11bJ3N3aXRjaHdpZHRoYXV0byddfS0tPgoJCQkJCQk8YSBocmVmPSJqYXZhc2NyaXB0OjsiIGlkPSJzd2l0Y2h3aWR0aCIgb25jbGljaz0id2lkdGhhdXRvKHRoaXMpIiB0aXRsZT0ie2lmIHdpZHRoYXV0bygpfXtsYW5nIHN3aXRjaF9uYXJyb3d9e2Vsc2V9e2xhbmcgc3dpdGNoX3dpZGV9ey9pZn0iIGNsYXNzPSJzd2l0Y2h3aWR0aCI+PCEtLXtpZiB3aWR0aGF1dG8oKX0tLT57bGFuZyBzd2l0Y2hfbmFycm93fTwhLS17ZWxzZX0tLT57bGFuZyBzd2l0Y2hfd2lkZX08IS0tey9pZn0tLT48L2E+CgkJCQkJPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXtpZiAkX0dbJ3VpZCddICYmICFlbXB0eSgkX0dbJ3N0eWxlJ11bJ2V4dHN0eWxlJ10pfS0tPjxhIGlkPSJzc2xjdCIgaHJlZj0iamF2YXNjcmlwdDo7IiBvbm1vdXNlb3Zlcj0iZGVsYXlTaG93KHRoaXMsIGZ1bmN0aW9uKCkge3Nob3dNZW51KHsnY3RybGlkJzonc3NsY3QnLCdwb3MnOiczNCEnfSl9KTsiPntsYW5nIGNoYW5nZXN0eWxlfTwvYT48IS0tey9pZn0tLT4KCQkJCQk8IS0te2lmIGNoZWNrX2RpeV9wZXJtKCR0b3BpYyl9LS0+CgkJCQkJCSRkaXluYXYKCQkJCQk8IS0tey9pZn0tLT4KCQkJCTwvZGl2PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCgkJPCEtLXtpZiAhSVNfUk9CT1R9LS0+CgkJCTwhLS17aWYgJF9HWyd1aWQnXSAmJiAhJF9HWydzZXR0aW5nJ11bJ2JiY2xvc2VkJ10gJiYgZW1wdHkoJF9HWydtZW1iZXInXVsnZnJlZXplJ10pICYmICRfR1snbWVtYmVyJ11bJ2dyb3VwaWQnXSAhPSA1fS0tPgoJCQk8dWwgaWQ9Im15cHJvbXB0X21lbnUiIGNsYXNzPSJwX3BvcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCTxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9c3BhY2UmZG89cG0iIGlkPSJwbV9udGMiIHN0eWxlPSJiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsiPjxlbSBjbGFzcz0icHJvbXB0X25ld3N7aWYgZW1wdHkoJF9HW21lbWJlcl1bbmV3cG1dKX1fMHsvaWZ9Ij48L2VtPntsYW5nIHBtX2NlbnRlcn08L2E+PC9saT4KCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ2ZvbGxvd3N0YXR1cyddfS0tPgoJCQkJCTxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9Zm9sbG93JmRvPWZvbGxvd2VyIj48ZW0gY2xhc3M9InByb21wdF9mb2xsb3dlcntpZiBlbXB0eSgkX0dbbWVtYmVyXVtuZXdwcm9tcHRfbnVtXVtmb2xsb3dlcl0pfV8wey9pZn0iPjwvZW0+PCEtLXtsYW5nIG5vdGljZV9pbnRlcmFjdGl2ZV9mb2xsb3dlcn0tLT57aWYgJF9HW21lbWJlcl1bbmV3cHJvbXB0X251bV1bZm9sbG93ZXJdfSgkX0dbbWVtYmVyXVtuZXdwcm9tcHRfbnVtXVtmb2xsb3dlcl0pey9pZn08L2E+PC9saT4KCQkJCQk8IS0te2lmICRfR1ttZW1iZXJdW25ld3Byb21wdF0gJiYgJF9HW21lbWJlcl1bbmV3cHJvbXB0X251bV1bZm9sbG93XX0tLT4KCQkJCQkJPGxpPjxhIGhyZWY9ImhvbWUucGhwP21vZD1mb2xsb3ciPjxlbSBjbGFzcz0icHJvbXB0X2NvbmNlcm4iPjwvZW0+PCEtLXtsYW5nIG5vdGljZV9pbnRlcmFjdGl2ZV9mb2xsb3d9LS0+KCRfR1ttZW1iZXJdW25ld3Byb21wdF9udW1dW2ZvbGxvd10pPC9hPjwvbGk+CgkJCQkJPCEtLXsvaWZ9LS0+CgkJCQk8IS0tey9pZn0tLT4KCQkJCTwhLS17aWYgJF9HW21lbWJlcl1bbmV3cHJvbXB0XX0tLT4KCQkJCQk8IS0te2xvb3AgJF9HWydtZW1iZXInXVsnY2F0ZWdvcnlfbnVtJ10gJGtleSAkdmFsfS0tPgoJCQkJCQk8bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPW5vdGljZSZ2aWV3PSRrZXkiPjxlbSBjbGFzcz0ibm90aWNlXyRrZXkiPjwvZW0+PCEtLXtlY2hvIGxhbmcoJ3RlbXBsYXRlJywgJ25vdGljZV8nLiRrZXkpfS0tPig8c3BhbiBjbGFzcz0icnEiPiR2YWw8L3NwYW4+KTwvYT48L2xpPgoJCQkJCTwhLS17L2xvb3B9LS0+CgkJCQk8IS0tey9pZn0tLT4KCQkJCTwhLS17aWYgZW1wdHkoJF9HWydjb29raWUnXVsnaWdub3JlX25vdGljZSddKX0tLT4KCQkJCQk8bGkgY2xhc3M9Imlnbm9yZV9ub3RpY2VsaSI+PGEgaHJlZj0iamF2YXNjcmlwdDo7IiBvbmNsaWNrPSJzZXRjb29raWUoJ2lnbm9yZV9ub3RpY2UnLCAxKTtoaWRlTWVudSgnbXlwcm9tcHRfbWVudScpIiB0aXRsZT0ie2xhbmcgdGVtcG9yYXJpbHlfdG9fcmVtaW5kfSI+PGVtIGNsYXNzPSJpZ25vcmVfbm90aWNlIj48L2VtPjwvYT48L2xpPgoJCQkJPCEtLXsvaWZ9LS0+CgkJCTwvdWw+CgkJCTwhLS17L2lmfS0tPgoJCQk8IS0te2lmICRfR1sndWlkJ10gJiYgIWVtcHR5KCRfR1snc3R5bGUnXVsnZXh0c3R5bGUnXSl9LS0+CgkJCQk8ZGl2IGlkPSJzc2xjdF9tZW51IiBjbGFzcz0iY2wgcF9wb3AiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQkJPCEtLXtpZiAhJF9HW3N0eWxlXVtkZWZhdWx0ZXh0c3R5bGVdfS0tPjxzcGFuIGNsYXNzPSJzc2xjdF9idG4iIG9uY2xpY2s9ImV4dHN0eWxlKCcnKSIgdGl0bGU9IntsYW5nIGRlZmF1bHR9Ij48aT48L2k+PC9zcGFuPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3N0eWxlJ11bJ2V4dHN0eWxlJ10gJGV4dHN0eWxlfS0tPgoJCQkJCQk8c3BhbiBjbGFzcz0ic3NsY3RfYnRuIiBvbmNsaWNrPSJleHRzdHlsZSgnJGV4dHN0eWxlWzBdJykiIHRpdGxlPSIkZXh0c3R5bGVbMV0iPjxpIHN0eWxlPSdiYWNrZ3JvdW5kOiRleHRzdHlsZVsyXSc+PC9pPjwvc3Bhbj4KCQkJCQk8IS0tey9sb29wfS0tPgoJCQkJPC9kaXY+CgkJCTwhLS17L2lmfS0tPgoJCQk8IS0te2lmICRfR1sndWlkJ119LS0+CgkJCQk8dWwgaWQ9Im15aXRlbV9tZW51IiBjbGFzcz0icF9wb3AiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQkJPCEtLXtpZiAkX0dbJ3NldHRpbmcnXVsnZm9ydW1zdGF0dXMnXX0tLT48bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPXRocmVhZCZ2aWV3PW1lIj57bGFuZyBteXBvc3R9PC9hPjwvbGk+PCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXtpZiAkX0dbJ3NldHRpbmcnXVsnZmF2b3JpdGVzdGF0dXMnXX0tLT48bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPWZhdm9yaXRlJnZpZXc9bWUiPntsYW5nIGZhdm9yaXRlfTwvYT48L2xpPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ2ZyaWVuZHN0YXR1cyddfS0tPjxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9c3BhY2UmZG89ZnJpZW5kIj57bGFuZyBmcmllbmRzfTwvYT48L2xpPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17aG9vay9nbG9iYWxfbXlpdGVtX2V4dHJhfS0tPgoJCQkJPC91bD4KCQkJPCEtLXsvaWZ9LS0+CgkJCTwhLS17c3VidGVtcGxhdGUgY29tbW9uL2hlYWRlcl9xbWVudX0tLT4KCQk8IS0tey9pZn0tLT4KCgkJPCEtLXthZC9oZWFkZXJiYW5uZXIvd3AgYV9ofS0tPgoJCTxkaXYgaWQ9ImhkIj4KCQkJPGRpdiBjbGFzcz0id3AiPgoJCQkJPGRpdiBjbGFzcz0iaGRjIGNsIj4KCQkJCQk8IS0te2V2YWwgJG1uaWQgPSBnZXRjdXJyZW50bmF2KCk7fS0tPgoJCQkJCTxoMj48IS0te2lmICFpc3NldCgkX0dbJ3NldHRpbmcnXVsnbmF2bG9nb3MnXVskbW5pZF0pfS0tPjxhIGhyZWY9IntpZiAkX0dbJ3NldHRpbmcnXVsnZG9tYWluJ11bJ2FwcCddWydkZWZhdWx0J119eyRfR1snc2NoZW1lJ119Oi8veyRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2RlZmF1bHQnXX0ve2Vsc2V9Li97L2lmfSIgdGl0bGU9IiRfR1snc2V0dGluZyddWydiYm5hbWUnXSI+eyRfR1snc3R5bGUnXVsnYm9hcmRsb2dvJ119PC9hPjwhLS17ZWxzZX0tLT4kX0dbJ3NldHRpbmcnXVsnbmF2bG9nb3MnXVskbW5pZF08IS0tey9pZn0tLT48L2gyPgoJCQkJCTwhLS17dGVtcGxhdGUgY29tbW9uL2hlYWRlcl91c2Vyc3RhdHVzfS0tPgoJCQkJPC9kaXY+CgoJCQkJPGRpdiBpZD0ibnYiPgoJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InFtZW51IiBvbm1vdXNlb3Zlcj0iZGVsYXlTaG93KHRoaXMsIGZ1bmN0aW9uICgpIHtzaG93TWVudSh7J2N0cmxpZCc6J3FtZW51JywncG9zJzonMzQhJywnY3RybGNsYXNzJzonYScsJ2R1cmF0aW9uJzoyfSk7c2hvd0ZvcnVtbWVudSgkX0dbZmlkXSk7fSkiPntsYW5nIG15X25hdn08L2E+CgkJCQkJPHVsPgoJCQkJCQk8IS0te2xvb3AgJF9HWydzZXR0aW5nJ11bJ25hdnMnXSAkbmF2fS0tPgoJCQkJCQkJPCEtLXtpZiBpc19hcnJheSgkbmF2KSAmJiAkbmF2WydhdmFpbGFibGUnXSAmJiAoISRuYXZbJ2xldmVsJ10gfHwgKCRuYXZbJ2xldmVsJ10gPT0gMSAmJiAkX0dbJ3VpZCddKSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAyICYmICRfR1snYWRtaW5pZCddID4gMCkgfHwgKCRuYXZbJ2xldmVsJ10gPT0gMyAmJiAkX0dbJ2FkbWluaWQnXSA9PSAxKSl9LS0+PGxpIHtpZiAkbW5pZCA9PSAkbmF2W25hdmlkXSB8fCBzdWJzdHIoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10sIDEpID09IHN0cl9yZXBsYWNlKCcuLycsICcnLCAkbmF2W2ZpbGVuYW1lXSl9Y2xhc3M9ImEiIHsvaWZ9JG5hdltuYXZdPjwvbGk+PCEtLXsvaWZ9LS0+CgkJCQkJCTwhLS17L2xvb3B9LS0+CgkJCQkJPC91bD4KCQkJCQk8IS0te2hvb2svZ2xvYmFsX25hdl9leHRyYX0tLT4KCQkJCTwvZGl2PgoJCQkJPCEtLXtpZiAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ3BsdWdpbnMnXVsnanNtZW51J10pfS0tPgoJCQkJCTx1bCBjbGFzcz0icF9wb3AgaF9wb3AiIGlkPSJwbHVnaW5fbWVudSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3NldHRpbmcnXVsncGx1Z2lucyddWydqc21lbnUnXSAkbW9kdWxlfS0tPgoJCQkJCQkgPCEtLXtpZiBpbl9hcnJheSgkbW9kdWxlWydhZG1pbmlkJ10sIGFycmF5KDAsIC0xKSkgfHwgKCRtb2R1bGVbJ2FkbWluaWQnXSAmJiAkX0dbJ2FkbWluaWQnXSA+IDAgJiYgJG1vZHVsZVsnYWRtaW5pZCddID49ICRfR1snYWRtaW5pZCddKX0tLT4KCQkJCQkJIDxsaT4kbW9kdWxlW3VybF08L2xpPgoJCQkJCQkgPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCQk8L3VsPgoJCQkJPCEtLXsvaWZ9LS0+CgkJCQkkX0dbc2V0dGluZ11bbWVudW5hdnNdCgkJCQk8ZGl2IGlkPSJtdSIgY2xhc3M9ImNsIj4KCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ3N1Ym5hdnMnXX0tLT4KCQkJCQk8IS0te2xvb3AgJF9HW3NldHRpbmddW3N1Ym5hdnNdICRuYXZpZCAkc3VibmF2fS0tPgoJCQkJCQk8IS0te2lmICRfR1snc2V0dGluZyddWyduYXZzdWJob3ZlciddIHx8ICRtbmlkID09ICRuYXZpZH0tLT4KCQkJCQkJPHVsIGNsYXNzPSJjbCB7aWYgJG1uaWQgPT0gJG5hdmlkfWN1cnJlbnR7L2lmfSIgaWQ9InNuYXZfJG5hdmlkIntpZiAkbW5pZCAhPSAkbmF2aWR9IHN0eWxlPSJkaXNwbGF5Om5vbmUiey9pZn0+CgkJCQkJCSRzdWJuYXYKCQkJCQkJPC91bD4KCQkJCQkJPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCTwhLS17L2lmfS0tPgoJCQkJPC9kaXY+CgkJCQk8IS0te2FkL3N1Ym5hdmJhbm5lci9hX211fS0tPgoJCQkJPCEtLXtzdWJ0ZW1wbGF0ZSBjb21tb24vcHVic2VhcmNoZm9ybX0tLT4KCQkJPC9kaXY+CgkJPC9kaXY+CgoJCTwhLS17aG9vay9nbG9iYWxfaGVhZGVyfS0tPgoJPCEtLXsvaWZ9LS0+CgoJPGRpdiBpZD0id3AiIGNsYXNzPSJ3cCI+Cg==
qidao123.com ToB IT社区-企服评测·应用市场»论坛 › 容器及微服务 › 容器及微服务 › K8s进阶之一文搞懂PV,PVC及SC
返回列表 发新帖

K8s进阶之一文搞懂PV,PVC及SC

[复制链接]
发表于 2025-5-11 18:25:21 | 显示全部楼层 |阅读模式
前言

想相识Pod的根本存储,可以参考这篇文章:K8s新手系列之Pod的根本存储
概述

官方文档:
什么是PV?

PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般环境下PV由kubernetes管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。
什么是PVC?

PVC(Persistent Volume Claim)是持久卷声明的意思,是用户对于存储需求的一种声明。换句话说,PVC其实就是用户向kubernetes系统发出的一种资源需求申请。
什么是SC?

SC(StorageClass)是存储类的意思,Kubernetes 可以根据 StorageClass 的定义动态地创建持久化存储卷(PersistentVolume, PV)和持久化卷声明(PersistentVolumeClaim, PVC)。StorageClass 提供了一种抽象层,允许用户在不关心底层存储实现细节的环境下请求存储资源。


PV详解

PV 是集群中可被申请的存储资源,由管理员提前创建并定义存储参数(如容量、访问权限、回收策略等)。它与具体的 Pod 解耦,可被多个 Pod 声明(通过 PVC)和使用。
PV分类

静态PV

由管理员手动创建 PV 资源清单,预先定义存储容量、访问模式、存储路径等参数,不依靠StorageClass。
适用于预先配置好的存储(如自建 NFS、GlusterFS 共享目录),或必要精细控制存储配置的场景。
动态PV:

通过StorageClass自动创建,无需手动编写 PV 清单,Kubernetes 根据PersistentVolumeClaim(PVC)的请求动态分配存储。
适用于云原生环境(如 AWS EBS、GCE PD)或必要按需分配存储的场景。
核心作用

解耦应用与存储基础设施:Pod 无需关心底层存储细节(如 NFS 服务器地点、云硬盘范例),通过 PVC 声明存储需求即可。
提供持久化存储:数据不随 Pod 销毁而丢失,适用于有状态应用(如数据库、文件服务)。
PV的生命周期


  • 供应阶段(Provisioning):

    • 静态供应(Static Provisioning):管理员手动创建 PV 资源,预先定义存储细节(如容量、访问模式、存储范例等),适用于已知存储需求的场景。
    • 动态供应(Dynamic Provisioning):通过StorageClass自动创建 PV,当 PVC 申请存储时,Kubernetes 根据 SC 配置调用存储插件(如 NFS CSI 驱动)动态生成 PV。

  • 绑定阶段(Binding)

    • Bound:找到匹配的 PV,两者绑定(如用户示例中的pvc-sc-01状态为Bound)。
    • Pending:未找到匹配 PV(如用户示例中的pvc-sc-02因未指定 SC,但默认 SC 可能不满足条件而处于Pending)。

  • 使用阶段(Using)

    • Pod 通过 PVC 挂载 PV,数据持久化存储到后端存储(如 NFS 共享目录)。
    • 支持动态扩缩容(需 SC 开启allowVolumeExpansion: true),通过kubectl patch pvc调整容量。

  • 释放阶段(Releasing)
    当 PVC 被删除(kubectl delete pvc),PV 进入Released状态:

    • PV 不再被 PVC 绑定,但数据仍生存在后端存储中(取决于 SC 的reclaimPolicy)。
    • 此时 PV 可能存在 “孤儿” 状态(如 PV 配置与新 PVC 需求不匹配,无法重新绑定)。

  • 回收阶段(Reclaiming)
    PV 的回收行为由reclaimPolicy决定(定义在 PV 或 SC 中,SC 优先级高于 PV),支持三种策略:

    • Retain(生存,默认)
      PV 释放后生存数据,需管理员手动清理后端存储或删除 PV。
      适用于必要手动管理数据的场景(如用户示例中的 SC 配置reclaimPolicy: Retain)。
    • Delete(删除)
      PV 释放后自动删除后端存储资源(如 NFS 共享目录会被删除,需审慎!)。
      适用于临时存储或无状态应用。
    • Recycle(回收,已弃用)
      清除 PV 数据(如执行rm -rf /data/*),Kubernetes 1.17 + 已废弃,推荐使用Delete或Retain。

PV资源清单文件详解
  1. apiVersion: v1          # API版本,PV属于core API组,版本固定为v1
  2. kind: PersistentVolume  # 资源类型为PersistentVolume
  3. metadata:
  4.   name: pv-nfs          # PV名称,全局唯一
  5.   labels:               # 可选标签,用于筛选和关联PVC
  6.     storage: nfs
  7.   annotations:          # 可选注解,附加元数据
  8.     description: "NFS storage for web apps"
  9. spec:
  10.   capacity:             # PV的存储容量,必填
  11.     storage: 10Gi       # 容量大小,支持Gi、Ti等单位
  12.   accessModes:          # 访问模式,定义PV如何被挂载,必填(至少一个)
  13.     - ReadWriteOnce     # RWO:单节点读写(最常用,支持Node或Pod级别)
  14.     - ReadOnlyMany      # ROX:多节点只读
  15.     - ReadWriteMany     # RWX:多节点读写(需存储支持,如NFS、GlusterFS)
  16.   persistentVolumeReclaimPolicy: # 回收策略,定义PV释放后的处理方式,默认Retain
  17.     Retain              # 保留数据,需手动清理(默认)
  18.     # Recycle         # 已弃用,等价于Delete(仅支持NFS等少数存储)
  19.     # Delete            # 删除存储(如云硬盘EBS会被删除,NFS仅删除PVC绑定)
  20.   storageClassName: ""  # 关联的StorageClass名称,空字符串表示默认类,或不指定
  21.   mountOptions:         # 挂载时的额外选项(如文件系统参数),可选
  22.     - hard
  23.     - nfsvers=4.1
  24.   nfs:                  # 存储类型配置(不同存储类型字段不同,此处以NFS为例)
  25.     server: 10.0.0.30   # NFS服务器IP
  26.     path: /data/nfs     # NFS共享路径
  27.   # 其他存储类型(如hostPath、AWS EBS、Ceph等)的配置字段不同,见下方说明
复制代码
关键字段说明

spec.accessModes(访问模式):必须至少指定一个模式,需与存储范例兼容:


  • ReadWriteOnce (RWO):单节点读写(支持同一节点上的多个 Pod 共享)。
  • ReadOnlyMany (ROX):多节点只读(如 NFS 允许多个节点挂载为只读)。
  • ReadWriteMany (RWX):多节点读写(需存储支持,如 NFS、GlusterFS、CephFS)。
注意:云硬盘(如 EBS、PD)通常仅支持 RWO,而 NFS、CephFS 等分布式存储支持 RWX。
spec.persistentVolumeReclaimPolicy(回收策略)


  • Retain(生存)(默认):当 PVC 删除时,PV 数据生存,状态变为 Released,需手动清理数据或删除 PV。
  • Delete(删除):当 PVC 删除时,自动删除底层存储(如云硬盘、S3 Bucket),适用于动态创建的存储。
  • Recycle(回收)(已弃用):清空存储数据,仅适用于 NFS 等少数存储,Kubernetes 1.14 + 已移除。
创建静态pv实战案例

示例:
  1. # 定义pv
  2. [root@master01 ~/volumes]# cat pv-test01.yaml
  3. apiVersion: v1
  4. kind: PersistentVolume
  5. metadata:
  6.   name: pv-01
  7.   labels:
  8.     name: pv-01
  9. spec:
  10.   capacity:
  11.     storage: 10Gi
  12.   # 指定存储类型为nfs
  13.   nfs:
  14.     server: 10.0.0.30
  15.     path: /data/nfs/nginx/pv-01
  16.   # 访问模式
  17.   accessModes:
  18.   # 多节点读写
  19.   - ReadWriteMany
  20.   persistentVolumeReclaimPolicy: Retain
  21. # 创建pv
  22. [root@master01 ~/volumes]# kubectl apply -f pv-test01.yaml
  23. persistentvolume/pv-01 created
  24. # 查看pv
  25. [root@master01 ~/volumes]# kubectl get pv
  26. NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
  27. pv-01   10Gi       RWX            Retain           Available                                   7s
  28. # 查看详细信息
  29. [root@master01 ~/volumes]# kubectl describe pv pv-01
  30. Name:            pv-01
  31. Labels:          <none>
  32. Annotations:     <none>
  33. Finalizers:      [kubernetes.io/pv-protection]
  34. StorageClass:
  35. Status:          Available
  36. Claim:
  37. Reclaim Policy:  Retain
  38. Access Modes:    RWX
  39. VolumeMode:      Filesystem
  40. Capacity:        20Gi
  41. Node Affinity:   <none>
  42. Message:
  43. Source:
  44.     Type:      NFS (an NFS mount that lasts the lifetime of a pod)
  45.     Server:    10.0.0.30
  46.     Path:      /data/nfs/nginx/pv-01
  47.     ReadOnly:  false
  48. Events:        <none>
复制代码
使用kubectl管理pv

查看pv
  1. kubectl get pv <pv-name>
  2. kubectl describe pv <pv-name>
复制代码
删除pv
  1. kubectl delete pv <pv-name>
复制代码
修改pv
  1. 方式一:修改资源清单文件再apply即可
  2. 方式二:通过kubectl edit修改保存即可
复制代码
PVC详解

PVC(Persistent Volume Claim)是持久卷声明的意思,是用户对于存储需求的一种声明。换句话说,PVC其实就是用户向kubernetes系统发出的一种资源需求申请。
核心概念

PVC 是名称空间级别的资源,用于声明:

  • 必要的存储容量(如 5Gi)。
  • 支持的访问模式(如 ReadWriteOnce)。
  • 期望的存储范例(通过storageClassName关联 StorageClass)。
PVC 与 PV 的关系类似于 Pod 与 Node 的关系:PVC 请求资源,PV 提供资源,两者通过绑定机制匹配。
PVC资源清单文件详解
  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4.   name: my-pvc  # PVC名称,命名空间内唯一
  5.   namespace: default  # 命名空间,默认default
  6.   labels:
  7.     app: my-app
  8. spec:
  9.   accessModes:  # 访问模式,必须与PV兼容
  10.     - ReadWriteOnce  # 单节点读写
  11.   resources:
  12.     requests:
  13.       storage: 5Gi  # 请求的存储容量
  14.   storageClassName: "standard"  # 关联的StorageClass名称,""表示使用默认类
  15.   selector:  # 可选,通过标签筛选PV
  16.     matchLabels:
  17.       storage-type: "ssd"
复制代码
关键字段说明

spec.accessModes(访问模式):必须至少指定一个模式,需与存储范例兼容:


  • ReadWriteOnce (RWO):单节点读写(支持同一节点上的多个 Pod 共享)。
  • ReadOnlyMany (ROX):多节点只读(如 NFS 允许多个节点挂载为只读)。
  • ReadWriteMany (RWX):多节点读写(需存储支持,如 NFS、GlusterFS、CephFS)。
注意:云硬盘(如 EBS、PD)通常仅支持 RWO,而 NFS、CephFS 等分布式存储支持 RWX。
创建PVC关联PV实战

创建PV

以上面案例为基础,可以修改一下,参考下面的资源文件
  1. [root@master01 ~/volumes]# cat pv-test01.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5.   name: pv-01
  6.   labels:
  7.     name: pv-01
  8. spec:
  9.   capacity:
  10.     storage: 10Gi
  11.   # 指定存储类型为nfs
  12.   nfs:
  13.     server: 10.0.0.30
  14.     path: /data/nfs/nginx/pv-01
  15.   # 访问模式
  16.   accessModes:
  17.   # 多节点读写
  18.   - ReadWriteMany
  19.   persistentVolumeReclaimPolicy: Retain
复制代码
创建PVC
  1. # 定义资源文件
  2. [root@master01 ~/volumes]# cat pvc-test01.yaml
  3. apiVersion: v1
  4. kind: PersistentVolumeClaim
  5. metadata:
  6.   name: pvc-01
  7.   labels:
  8.     name: pvc-01
  9.   namespace: default
  10. spec:
  11.   # 定义访问模式,和pv一样即可
  12.   accessModes:
  13.   - ReadWriteMany
  14.   # 标签选择器,选择哪一个PV
  15.   selector:
  16.     matchExpressions:
  17.     - key: name
  18.       operator: In
  19.       values:
  20.       - pv-01
  21.   # 申请PV的容量,这里申请5G
  22.   resources:
  23.     requests:
  24.       storage: 5G
  25. # 创建PVC
  26. [root@master01 ~/volumes]# kubectl apply -f pvc-test01.yaml
  27. persistentvolumeclaim/pvc-01 created
复制代码
查看pv和pvc
  1. [root@master01 ~/volumes]# kubectl get pv,pvc
  2. NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
  3. persistentvolume/pv-01   10Gi       RWX            Retain           Bound    default/pvc-01                           27m
  4. NAME                           STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  5. persistentvolumeclaim/pvc-01   Bound    pv-01    10Gi       RWX                           7s
  6. # 查看详情
  7. [root@master01 ~/volumes]# kubectl describe pvc pvc-01
  8. Name:          pvc-01
  9. Namespace:     default
  10. StorageClass:
  11. Status:        Bound
  12. Volume:        pv-01
  13. Labels:        name=pvc-01
  14. Annotations:   pv.kubernetes.io/bind-completed: yes
  15.                pv.kubernetes.io/bound-by-controller: yes
  16. Finalizers:    [kubernetes.io/pvc-protection]
  17. Capacity:      10Gi
  18. Access Modes:  RWX
  19. VolumeMode:    Filesystem
  20. Used By:       <none>
  21. Events:        <none>
复制代码
创建Pod关联PVC使用PV存储

这里创建MySQL
  1. # 定义资源文件
  2. [root@master01 ~/volumes]# cat pod-mysql.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6.   name: pod-pvc
  7. spec:
  8.   volumes:
  9.   - name: data
  10.     # 指定存储类型为PVC
  11.     persistentVolumeClaim:
  12.       # 指定PVC的名称
  13.       claimName: pvc-01
  14.       # 是否只读,默认值为false,代表可读写
  15.       readOnly: false
  16.   containers:
  17.   - name: mysql
  18.     image: mysql:8.0.26
  19.     env:
  20.     - name: "MYSQL_ROOT_PASSWORD"
  21.       value: "root123"
  22.     # 挂载存储卷
  23.     volumeMounts:
  24.     # 指定存储卷的名称
  25.     - name: data
  26.       mountPath: /var/lib/mysql
  27. # 创建pod
  28. [root@master01 ~/volumes]# kubectl apply -f pod-mysql.yaml
  29. pod/pod-pvc created
复制代码
查看PV存储路径的数据
  1. [root@master01 ~/volumes]# ll /data/nfs/nginx/pv-01/
  2. total 198068
  3. -rw-r----- 1  999  999   196608 May 11 14:45 '#ib_16384_0.dblwr'
  4. -rw-r----- 1  999  999  8585216 May 11 14:45 '#ib_16384_1.dblwr'
  5. drwxr-x--- 2  999  999     4096 May 11 14:45 '#innodb_temp'/
  6. drwxr-xr-x 6  999 root     4096 May 11 14:45  ./
  7. drwxr-xr-x 4 root root     4096 May 11 14:44  ../
  8. -rw-r----- 1  999  999       56 May 11 14:45  auto.cnf
  9. -rw-r----- 1  999  999  3117023 May 11 14:45  binlog.000001
  10. -rw-r----- 1  999  999      156 May 11 14:45  binlog.000002
  11. -rw-r----- 1  999  999       32 May 11 14:45  binlog.index
  12. -rw------- 1  999  999     1680 May 11 14:45  ca-key.pem
  13. -rw-r--r-- 1  999  999     1112 May 11 14:45  ca.pem
  14. -rw-r--r-- 1  999  999     1112 May 11 14:45  client-cert.pem
  15. -rw------- 1  999  999     1680 May 11 14:45  client-key.pem
  16. -rw-r----- 1  999  999     5718 May 11 14:45  ib_buffer_pool
  17. -rw-r----- 1  999  999 50331648 May 11 14:45  ib_logfile0
  18. -rw-r----- 1  999  999 50331648 May 11 14:45  ib_logfile1
  19. -rw-r----- 1  999  999 12582912 May 11 14:45  ibdata1
  20. -rw-r----- 1  999  999 12582912 May 11 14:46  ibtmp1
  21. drwxr-x--- 2  999  999     4096 May 11 14:45  mysql/
  22. -rw-r----- 1  999  999 31457280 May 11 14:45  mysql.ibd
  23. drwxr-x--- 2  999  999     4096 May 11 14:45  performance_schema/
  24. -rw------- 1  999  999     1676 May 11 14:45  private_key.pem
  25. -rw-r--r-- 1  999  999      452 May 11 14:45  public_key.pem
  26. -rw-r--r-- 1  999  999     1112 May 11 14:45  server-cert.pem
  27. -rw------- 1  999  999     1680 May 11 14:45  server-key.pem
  28. drwxr-x--- 2  999  999     4096 May 11 14:45  sys/
  29. -rw-r----- 1  999  999 16777216 May 11 14:45  undo_001
  30. -rw-r----- 1  999  999 16777216 May 11 14:45  undo_002
复制代码
验证删除Pod示例之后数据是否生存

创建模拟数据
  1. # 进入容器
  2. [root@master01 ~/volumes]# kubectl exec -it pod-pvc -- /bin/bash
  3. # 连接MySQL
  4. root@pod-pvc:/# mysql -uroot -proot123
  5. # 创建测试库
  6. mysql> create database testdb;
  7. Query OK, 1 row affected (0.01 sec)
  8. # 查看数据库
  9. mysql> show databases;
  10. +--------------------+
  11. | Database           |
  12. +--------------------+
  13. | information_schema |
  14. | mysql              |
  15. | performance_schema |
  16. | sys                |
  17. | testdb             |
  18. +--------------------+
  19. 5 rows in set (0.01 sec)
复制代码
删除Pod后重新创建
  1. # 删除pod
  2. [root@master01 ~/volumes]# kubectl delete po pod-pvc
  3. pod "pod-pvc" deleted
  4. # 查看pv和pvc
  5. [root@master01 ~/volumes]# kubectl get pv,pvc
  6. NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
  7. persistentvolume/pv-01   10Gi       RWX            Retain           Bound    default/pvc-01                           47m
  8. NAME                           STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  9. persistentvolumeclaim/pvc-01   Bound    pv-01    10Gi       RWX                           20m
  10. # 重新创建
  11. [root@master01 ~/volumes]# kubectl apply -f pod-mysql.yaml
  12. pod/pod-pvc created
复制代码
进入新创建的pod内查看库是否存在
  1. # 进入容器
  2. [root@master01 ~/volumes]# kubectl exec -it pod-pvc -- /bin/bash
  3. # 连接数据库
  4. root@pod-pvc:/# mysql -uroot -proot123
  5. mysql: [Warning] Using a password on the command line interface can be insecure.
  6. Welcome to the MySQL monitor.  Commands end with ; or \g.
  7. Your MySQL connection id is 8
  8. Server version: 8.0.26 MySQL Community Server - GPL
  9. Copyright (c) 2000, 2021, Oracle and/or its affiliates.
  10. Oracle is a registered trademark of Oracle Corporation and/or its
  11. affiliates. Other names may be trademarks of their respective
  12. owners.
  13. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  14. # 查看数据
  15. mysql> show databases;
  16. +--------------------+
  17. | Database           |
  18. +--------------------+
  19. | information_schema |
  20. | mysql              |
  21. | performance_schema |
  22. | sys                |
  23. | testdb             |
  24. +--------------------+
  25. 5 rows in set (0.00 sec)
复制代码
测试删除Pod和PVC之后,PV的数据是否还存在

经过验证,数据仍旧存在
  1. # 删除pod和pvc
  2. [root@master01 ~/volumes]# kubectl delete po pod-pvc
  3. pod "pod-pvc" deleted
  4. [root@master01 ~/volumes]# kubectl delete pvc pvc-01
  5. persistentvolumeclaim "pvc-01" deleted
  6. # 查看pv,状态为Released
  7. [root@master01 ~/volumes]# kubectl get pv
  8. NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM            STORAGECLASS   REASON   AGE
  9. pv-01   10Gi       RWX            Retain           Released   default/pvc-01                           50m
  10. # 查看数据是否存在
  11. [root@master01 ~/volumes]# ll /data/nfs/nginx/pv-01/
  12. total 185784
  13. -rw-r----- 1  999  999   196608 May 11 14:54 '#ib_16384_0.dblwr'
  14. -rw-r----- 1  999  999  8585216 May 11 14:45 '#ib_16384_1.dblwr'
  15. drwxr-x--- 2  999  999     4096 May 11 14:55 '#innodb_temp'/
  16. drwxr-xr-x 7  999 root     4096 May 11 14:55  ./
  17. drwxr-xr-x 4 root root     4096 May 11 14:44  ../
  18. -rw-r----- 1  999  999       56 May 11 14:45  auto.cnf
  19. -rw-r----- 1  999  999  3117023 May 11 14:45  binlog.000001
  20. -rw-r----- 1  999  999      370 May 11 14:52  binlog.000002
  21. -rw-r----- 1  999  999      179 May 11 14:55  binlog.000003
  22. -rw-r----- 1  999  999       48 May 11 14:52  binlog.index
  23. -rw------- 1  999  999     1680 May 11 14:45  ca-key.pem
  24. -rw-r--r-- 1  999  999     1112 May 11 14:45  ca.pem
  25. -rw-r--r-- 1  999  999     1112 May 11 14:45  client-cert.pem
  26. -rw------- 1  999  999     1680 May 11 14:45  client-key.pem
  27. -rw-r----- 1  999  999     3482 May 11 14:55  ib_buffer_pool
  28. -rw-r----- 1  999  999 50331648 May 11 14:54  ib_logfile0
  29. -rw-r----- 1  999  999 50331648 May 11 14:45  ib_logfile1
  30. -rw-r----- 1  999  999 12582912 May 11 14:55  ibdata1
  31. drwxr-x--- 2  999  999     4096 May 11 14:45  mysql/
  32. -rw-r----- 1  999  999 31457280 May 11 14:52  mysql.ibd
  33. drwxr-x--- 2  999  999     4096 May 11 14:45  performance_schema/
  34. -rw------- 1  999  999     1676 May 11 14:45  private_key.pem
  35. -rw-r--r-- 1  999  999      452 May 11 14:45  public_key.pem
  36. -rw-r--r-- 1  999  999     1112 May 11 14:45  server-cert.pem
  37. -rw------- 1  999  999     1680 May 11 14:45  server-key.pem
  38. drwxr-x--- 2  999  999     4096 May 11 14:45  sys/
  39. drwxr-x--- 2  999  999     4096 May 11 14:49  testdb/
  40. -rw-r----- 1  999  999 16777216 May 11 14:54  undo_001
  41. -rw-r----- 1  999  999 16777216 May 11 14:54  undo_002
复制代码
PVC和PV的绑定机制

PVC 与 PV 的绑定遵循以下规则:

  • 访问模式匹配:PVC 的accessModes必须是 PV 支持的子集(如 PV 支持 RWX,PVC 可请求 RWO 或 RWX)。
  • 容量匹配:PV 的容量必须≥PVC 请求的容量。
  • 存储类匹配:

    • 若 PVC 指定storageClassName,则仅匹配雷同 StorageClass 的 PV。
    • 若 PVC 未指定storageClassName,则仅匹配未关联任何 StorageClass的 PV。

  • 标签选择器匹配:若 PVC 使用selector,则 PV 必须包含所有指定标签。
绑定状态:

  • Bound:已乐成绑定 PV。
  • Pending:未找到匹配的 PV(需等待或手动创建)。
  • Lost:绑定的 PV 已消失(如被管理员删除)。
SC详解

SC(StorageClass)是存储类的意思,Kubernetes 可以根据 StorageClass 的定义动态地创建持久化存储卷(PersistentVolume, PV)和持久化卷声明(PersistentVolumeClaim, PVC)。StorageClass 提供了一种抽象层,允许用户在不关心底层存储实现细节的环境下请求存储资源。
SC的核心作用


  • 动态存储供给
    传统静态供给必要管理员手动创建 PV(PersistentVolume),而 StorageClass 支持动态供给:当用户创建 PVC(PersistentVolumeClaim)时,Kubernetes 会根据 PVC 指定的 StorageClass 自动创建对应的 PV,无需手动预定义。
  • 存储范例分类
    可定义多种 StorageClass(如 fast、slow、ssd、hdd),每种范例对应不同的存储参数(如存储介质、性能、备份策略等),满足不同业务需求。
  • 灵活配置 Provisioner
    通过关联存储插件(Provisioner),支持对接多种后端存储(如 AWS EBS、NFS、Ceph、GlusterFS 等),实现对不同存储系统的统一管理。
资源清单文件详解
  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4.   name: standard  # StorageClass 名称,PVC 通过此名称引用
  5. provisioner: kubernetes.io/aws-ebs  # 存储插件(Provisioner)
  6. parameters:    # 存储插件专属参数
  7.   type: gp2     # 例如 AWS EBS 的卷类型(gp2、io1 等)
  8. reclaimPolicy: Delete  # 回收策略(Delete 或 Retain,默认 Delete)
  9. volumeBindingMode: Immediate  # 卷绑定模式(Immediate 或 WaitForFirstConsumer,默认 Immediate)
  10. allowVolumeExpansion: true #允许卷扩容
  11. mountOptions:    # 挂载选项(可选)
  12.   - debug
复制代码
核心字段说明

provisioner(必选)

指定负责创建 PV 的存储插件,通常格式为 厂商名称.插件范例,比方:

  • kubernetes.io/aws-ebs(AWS EBS 卷)
  • nfs-client.provisioner(NFS 客户端插件)
  • local.csi.k8s.io(本地存储 CSI 插件)
parameters(可选)

通报给 Provisioner 的参数,不同插件参数不同,比方:

  • NFS 插件:server=10.0.0.10, share=/nfs/share
  • AWS EBS 插件:type=io1, iopsPerGB=10
reclaimPolicy(可选,默认 Delete)

当 PVC 被删除时,PV 的处置惩罚策略:

  • Delete:自动删除 PV 及后端存储资源(如 EBS 卷)。
  • Retain:生存 PV 及数据,需手动清理(适用于必要数据持久化的场景)。
volumeBindingMode(可选,默认 Immediate)

控制 PV 与节点的绑定机遇:

  • Immediate:立刻绑定,适用于不必要节点亲和性的场景。
  • WaitForFirstConsumer:延迟绑定,直到 Pod 调度时才绑定 PV,支持结合节点亲和性选择存储位置(如本地存储需绑定到特定节点)。
配置以NFS为存储的SC插件

K8s原生组件并不支持NFS动态存储,所以必要一些额外的配置
K8s官网:https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/#nfs
项目官网:https://github.com/kubernetes-csi/csi-driver-nfs#readme
我这里使用kubectl进行安装:
参考:https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/docs/install-csi-driver-master.md
实操:
  1. [root@master01 ~]# wget https://github.com/kubernetes-csi/csi-driver-nfs/archive/refs/tags/v4.11.0.tar.gz
  2. [root@master01 ~]# tar -xvf csi-driver-nfs-4.11.0.tar.gz
  3. [root@master01 ~]# cd csi-driver-nfs-4.11.0
  4. # 修改镜像源,防止镜像拉不下来
  5. [root@master01 ~/csi-driver-nfs-4.11.0/deploy]# sed -i s#registry.k8s.io#k8s.m.daocloud.io#g deploy/csi-nfs-controller.yaml
  6. [root@master01 ~/csi-driver-nfs-4.11.0/deploy]# sed -i s#registry.k8s.io#k8s.m.daocloud.io#g deploy/csi-snapshot-controller.yaml
  7. [root@master01 ~/csi-driver-nfs-4.11.0/deploy]# sed -i s#registry.k8s.io#k8s.m.daocloud.io#g deploy/csi-nfs-node.yaml
  8. # 执行安装,注意脚本后面添加参数
  9. [root@master01 ~/csi-driver-nfs-4.11.0/deploy]# ./install-driver.sh master local
  10. Installing NFS CSI driver, version: master ...
  11. serviceaccount/csi-nfs-controller-sa created
  12. serviceaccount/csi-nfs-node-sa created
  13. clusterrole.rbac.authorization.k8s.io/nfs-external-provisioner-role created
  14. clusterrolebinding.rbac.authorization.k8s.io/nfs-csi-provisioner-binding created
  15. clusterrole.rbac.authorization.k8s.io/nfs-external-resizer-role created
  16. clusterrolebinding.rbac.authorization.k8s.io/nfs-csi-resizer-role created
  17. csidriver.storage.k8s.io/nfs.csi.k8s.io created
  18. deployment.apps/csi-nfs-controller created
  19. daemonset.apps/csi-nfs-node created
  20. NFS CSI driver installed successfully.
  21. # 检查一下pod是否启动Running
  22. [root@master01 ~/csi-driver-nfs-4.11.0]# kubectl -n kube-system get pod -o wide -l app=csi-nfs-node
  23. NAME                 READY   STATUS    RESTARTS   AGE   IP          NODE       NOMINATED NODE   READINESS GATES
  24. csi-nfs-node-4w6fg   3/3     Running   0          89s   10.0.0.32   node02     <none>           <none>
  25. csi-nfs-node-jhsf2   3/3     Running   0          89s   10.0.0.31   node01     <none>           <none>
  26. csi-nfs-node-sbp76   3/3     Running   0          89s   10.0.0.30   master01   <none>           <none>
  27. [root@master01 ~/csi-driver-nfs-4.11.0]# kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
  28. NAME                                  READY   STATUS    RESTARTS      AGE    IP          NODE       NOMINATED NODE   READINESS GATES
  29. csi-nfs-controller-6d4bb5ddbc-fgmq6   5/5     Running   1 (41s ago)   105s   10.0.0.30   master01   <none>           <none>
复制代码
创建SC实战
  1. [root@master01 ~/volumes]# cat sc-01.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5.   name: sc-01  # StorageClass名称,PVC通过该名称引用此存储类
  6. provisioner: nfs.csi.k8s.io  # 指定使用NFS CSI驱动作为存储供给器
  7. parameters:  # 传递给NFS CSI驱动的参数
  8.   server: 10.0.0.30  # NFS服务器的IP地址
  9.   share: /data/nfs/nginx/sc-01  # NFS服务器上的共享目录路径
  10.   # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume
  11.   # csi.storage.k8s.io/provisioner-secret-name: "mount-options"
  12.   # csi.storage.k8s.io/provisioner-secret-namespace: "default"
  13. reclaimPolicy: Retain  # 回收策略:当PVC被删除时,PV保留不删除
  14. volumeBindingMode: Immediate  # 卷绑定模式:立即绑定,不需要等待Pod调度
  15. allowVolumeExpansion: true  # 允许卷扩容:支持通过修改PVC请求更大容量
  16. # 创建sc
  17. [root@master01 ~/volumes]# kubectl apply -f sc-01.yaml
  18. storageclass.storage.k8s.io/sc-01 created
  19. # 查看sc
  20. [root@master01 ~/volumes]# kubectl get sc
  21. NAME    PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  22. sc-01   nfs.csi.k8s.io   Retain          Immediate           true                   5s
复制代码
创建PVC关联SC
  1. # 定义资源文件
  2. [root@master01 ~/volumes]# cat pvc-sc-01.yaml
  3. apiVersion: v1
  4. kind: PersistentVolumeClaim
  5. metadata:
  6.   name: pvc-sc-01
  7. spec:
  8.   accessModes:
  9.     - ReadWriteMany
  10.   # 指定sc的名称进行关联
  11.   storageClassName: sc-01
  12.   resources:
  13.     requests:
  14.       storage: 5Gi
  15. # 创建sc
  16. [root@master01 ~/volumes]# kubectl apply -f pvc-sc-01.yaml
  17. persistentvolumeclaim/pvc-sc-01 unchanged
  18. # 查看pvc和sc
  19. [root@master01 ~/volumes]# kubectl get pvc,sc
  20. NAME                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  21. persistentvolumeclaim/pvc-sc-01   Bound    pvc-4ed0c30c-6827-4498-bd53-bff5accbd47d   5Gi        RWX            sc-01          28s
  22. NAME                                PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  23. storageclass.storage.k8s.io/sc-01   nfs.csi.k8s.io   Retain          Immediate           true                   6m4s
复制代码
创建Pod关联PVC使用SC

示例:
  1. #定义资源文件
  2. [root@master01 ~/volumes]# cat pod-sc.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6.   name: pod-sc
  7. spec:
  8.   volumes:
  9.   - name: data
  10.     # 指定存储类型为PVC
  11.     persistentVolumeClaim:
  12.       # 指定PVC的名称
  13.       claimName: pvc-sc-01
  14.       # 是否只读,默认值为false,代表可读写
  15.       readOnly: false
  16.   containers:
  17.   - name: mysql
  18.     image: mysql:8.0.26
  19.     env:
  20.     - name: "MYSQL_ROOT_PASSWORD"
  21.       value: "root123"
  22.     # 挂载存储卷
  23.     volumeMounts:
  24.     # 指定存储卷的名称
  25.     - name: data
  26.       mountPath: /var/lib/mysql
  27. # 创建pod
  28. [root@master01 ~/volumes]# kubectl apply -f pod-sc.yaml
  29. pod/pod-sc created
复制代码
查看挂载的路径
  1. [root@master01 ~]# cd /data/nfs/nginx/sc-01/
  2. # pvc-4ed0c30c-6827-4498-bd53-bff5accbd47d/的名称和PVC的VOLUME字段对应
  3. [root@master01 /data/nfs/nginx/sc-01]# ll
  4. total 12
  5. drwxr-xr-x 3 root root 4096 May 11 16:03 ./
  6. drwxr-xr-x 5 root root 4096 May 11 15:57 ../
  7. drwxr-xr-x 6  999 root 4096 May 11 16:07 pvc-4ed0c30c-6827-4498-bd53-bff5accbd47d/
  8. [root@master01 /data/nfs/nginx/sc-01]# ll pvc-4ed0c30c-6827-4498-bd53-bff5accbd47d/
  9. total 198068
  10. -rw-r----- 1  999  999   196608 May 11 16:07 '#ib_16384_0.dblwr'
  11. -rw-r----- 1  999  999  8585216 May 11 16:07 '#ib_16384_1.dblwr'
  12. drwxr-x--- 2  999  999     4096 May 11 16:07 '#innodb_temp'/
  13. drwxr-xr-x 6  999 root     4096 May 11 16:07  ./
  14. drwxr-xr-x 3 root root     4096 May 11 16:03  ../
  15. -rw-r----- 1  999  999       56 May 11 16:07  auto.cnf
  16. -rw-r----- 1  999  999  3117023 May 11 16:07  binlog.000001
  17. -rw-r----- 1  999  999      156 May 11 16:07  binlog.000002
  18. -rw-r----- 1  999  999       32 May 11 16:07  binlog.index
  19. -rw------- 1  999  999     1680 May 11 16:07  ca-key.pem
  20. -rw-r--r-- 1  999  999     1112 May 11 16:07  ca.pem
  21. -rw-r--r-- 1  999  999     1112 May 11 16:07  client-cert.pem
  22. -rw------- 1  999  999     1680 May 11 16:07  client-key.pem
  23. -rw-r----- 1  999  999     5721 May 11 16:07  ib_buffer_pool
  24. -rw-r----- 1  999  999 50331648 May 11 16:07  ib_logfile0
  25. -rw-r----- 1  999  999 50331648 May 11 16:07  ib_logfile1
  26. -rw-r----- 1  999  999 12582912 May 11 16:07  ibdata1
  27. -rw-r----- 1  999  999 12582912 May 11 16:08  ibtmp1
  28. drwxr-x--- 2  999  999     4096 May 11 16:07  mysql/
  29. -rw-r----- 1  999  999 31457280 May 11 16:07  mysql.ibd
  30. drwxr-x--- 2  999  999     4096 May 11 16:07  performance_schema/
  31. -rw------- 1  999  999     1680 May 11 16:07  private_key.pem
  32. -rw-r--r-- 1  999  999      452 May 11 16:07  public_key.pem
  33. -rw-r--r-- 1  999  999     1112 May 11 16:07  server-cert.pem
  34. -rw------- 1  999  999     1680 May 11 16:07  server-key.pem
  35. drwxr-x--- 2  999  999     4096 May 11 16:07  sys/
  36. -rw-r----- 1  999  999 16777216 May 11 16:07  undo_001
  37. -rw-r----- 1  999  999 16777216 May 11 16:07  undo_002
复制代码
配置默认的SC

默认的 SC(StorageClass) 是指当创建 PVC(PersistentVolumeClaim) 时未显式指定 storageClassName 时,系统自动使用的 StorageClass。以下是关于默认 SC 的配置和相干说明:
在 Kubernetes 集群中,默认 StorageClass(SC)的数目是0 个或 1 个。Kubernetes 不强制要求必须有默认 SC,但假如存在,只能有一个被标记为默认
创建默认的SC

默认 SC 通过 metadata.annotations 中的 storageclass.kubernetes.io/is-default-class: "true" 标记
示例
  1. # 定义资源清单文件
  2. [root@master01 ~/volumes]# cat sc-default.yaml
  3. apiVersion: storage.k8s.io/v1
  4. kind: StorageClass
  5. metadata:
  6.   # StorageClass名称,PVC通过该名称引用此存储类
  7.   name: sc-default
  8.   annotations:
  9.     # 标记为默认存储类
  10.     storageclass.kubernetes.io/is-default-class: "true"
  11. # 指定使用NFS CSI驱动作为存储供给器
  12. provisioner: nfs.csi.k8s.io
  13. # 传递给NFS CSI驱动的参数
  14. parameters:
  15.   # NFS服务器的IP地址
  16.   server: 10.0.0.30
  17.   # NFS服务器上的共享目录路径
  18.   share: /data/nfs/nginx/sc-default
  19.   # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume
  20.   # csi.storage.k8s.io/provisioner-secret-name: "mount-options"
  21.   # csi.storage.k8s.io/provisioner-secret-namespace: "default"
  22. # 回收策略:当PVC被删除时,PV保留不删除
  23. reclaimPolicy: Retain
  24. # 卷绑定模式:立即绑定,不需要等待Pod调度
  25. volumeBindingMode: Immediate
  26. # 允许卷扩容:支持通过修改PVC请求更大容量
  27. allowVolumeExpansion: true
  28. # 创建sc
  29. [root@master01 ~/volumes]# kubectl apply -f sc-default.yaml
  30. storageclass.storage.k8s.io/sc-default created
  31. # 查看sc
  32. [root@master01 ~/volumes]# kubectl get sc
  33. NAME                   PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  34. sc-01                  nfs.csi.k8s.io   Retain          Immediate           true                   20m
  35. # 默认存储类
  36. sc-default (default)   nfs.csi.k8s.io   Retain          Immediate           true                   3s
复制代码
创建PVC关联默认的SC
  1. # 定义资源清单文件
  2. [root@master01 ~/volumes]# cat pvc-sc-02.yaml
  3. apiVersion: v1
  4. kind: PersistentVolumeClaim
  5. metadata:
  6.   name: pvc-sc-02
  7. spec:
  8.   accessModes:
  9.     - ReadWriteMany
  10.   # 这里不指定sc的名称,使用默认的SC
  11.   # storageClassName: sc-default
  12.   resources:
  13.     requests:
  14.       storage: 5Gi
  15. # 创建pvc
  16. [root@master01 ~/volumes]# kubectl apply -f pvc-sc-02.yaml
  17. persistentvolumeclaim/pvc-sc-02 created
  18. # 查看pvc和sc,发现都绑定成功了
  19. [root@master01 ~/volumes]# kubectl get pvc,sc
  20. NAME                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  21. persistentvolumeclaim/pvc-sc-01   Bound    pvc-4ed0c30c-6827-4498-bd53-bff5accbd47d   5Gi        RWX            sc-01          19m
  22. persistentvolumeclaim/pvc-sc-02   Bound    pvc-ae0b0c76-7c00-4986-b589-aa62ff9472fa   5Gi        RWX            sc-default     2m20s
  23. NAME                                               PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  24. storageclass.storage.k8s.io/sc-01                  nfs.csi.k8s.io   Retain          Immediate           true                   25m
  25. storageclass.storage.k8s.io/sc-default (default)   nfs.csi.k8s.io   Retain          Immediate           true                   3m36s
复制代码
创建Pod关联PVC使用SC(省略,自行测试)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录

QQ|手机版|qidao123.com IT社区;IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2026-10-2 01:34 , Processed in 0.172060 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表