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社区-企服评测·应用市场»论坛 › 容器及微服务 › 容器及微服务 › 【云原生】Deployment控制器具体
返回列表 发新帖

【云原生】Deployment控制器具体

[复制链接]
发表于 2024-10-16 13:00:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
Deployment


  
一、Deployment

1.1、什么是Deployment



  • Deployment同样也是Kubernetes系统的一个核心概念,主要职责和RC、RS一样都是保证Pod的数目和健康,通过定义一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建Pod,删除Deployment控制器,也会删除Deployment控制器下对应的ReplicaSet控制器和Pod资源。二则大部分功能都是完全同等的,我们可以看成是一个升级版的RC、RS控制器
1.2、Deployment功能



  • 声明式更新:用户可以声明所需的应用状态,Deployment控制器负责将当前徐徐更为所需状态。
  • 自动滚动更新:Deployment支持在更新应用时实行更新。使得应用的可用性持续,该过程会徐徐替换旧版本的Pod,确保在更新过程中不会有或少少有downtime。
  • 回滚功能:如果新的应用版本出现题目,Deployment允许用户快速回滚到先前的稳定版本。
  • 管理副本:Deployment控制器恶意维护指定数目的Pod副本,确保系统在任何时刻都有足够的副本在运行。
  • 自愈能力:Deployment会监控监控Pod的状态,并自动重启失败的Pod,以保持设定的副本数。
  • 版本控制:Deployment使用标签选择器来管理Pod,这使得用户可以很容器地跟踪和管理差别版本的应用。
1.3、Deployment用例场景



  • 创建Deployment以将ReplicaSet上线。ReplicaSet在后台创建Pod。查抄ReplicaSet的上线状态,查察其是否成功。
  • 通过更新Deployment的PodTemplateSpec,声明Pod的新状态。新的ReplicaSet会被创建,Deployment以受控速率将Pod从旧ReplicaSet迁移到新ReplicaSet。每个新的ReplicaSet都会更新Deployment的修订版本。
  • 如果Deployment的当前状态不稳定,回滚到较早的Deployment版本。每次回滚都会更新Deployment的修订版本。
  • 扩大Deployment规模以承担更多负载。
  • 停息Deployment的上线以应用对PodTemplateSpec所作的多项修改,然后规复实在行以启动新的上线版本。
  • 使用Deployment状态来判断上线过程是否出现停滞。
  • 清理较久的不再必要的ReplicaSet。
二、Deployment示例

2.1、示例



  • 下面的Deployment示例,其中创建了一个ReplicaSet,这个ReplicaSet负责启动三个nginxPod:
  1. [root@master ~]# vim nginx-deployment.yaml
复制代码
  1. apiVersion: "apps/v1"
  2. kind: Deployment
  3. metadata:
  4.   name: nginx-deployment
  5.   labels:
  6.     app: nginx
  7. spec:
  8.   replicas: 3
  9.   selector:
  10.     matchLabels:
  11.       app: nginx
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: nginx
  16.     spec:
  17.       restartPolicy: Always
  18.       containers:
  19.       - name: nginx
  20.         image: nginx:1.14.2
  21.         imagePullPolicy: IfNotPresent
  22.         ports:
  23.         - containerPort: 80
复制代码


  • 在该例中:

    • 创建名为nginx-deployment(由.metadata.name字段标明)的Deployment。该名称将成为后续创建ReplicaSet和Pod的名称底子
    • 该Deployment创建一个ReplicaSet,它创建三个(由.spec.replicas字段标明)Pod副本。
    • .spec.selector字段定义所创建的ReplicaSet如果查找要管理的Pod。在这里,你选择在Pod模板中定义的标签(app:nginx)。不过,更复杂的选择规则是也大概的,只要Pod模板本身满意所给规则即可。

  • template字段包罗以下子字段:

    • Pod被使用.metadata.labels字段打上app:nginx标签。
    • Pod模板规约(即.template.spec字段)指示Pod运行一个nginx容器,该容器运行版本为1.14.2的nginxDocker Hub镜像。
    • 创建一个容器并使用.spec.template.spec.containers.name字段将其命名为nginx

  • 开始之前,请确保你的Kubernetes集群已经正常运行。按照以下步骤创建上述Deployment
  1. [root@master ~]# kubectl apply -f nginx-deployment.yaml
复制代码


  • 运行kubectl get deployment查抄Deployment是否已经创建。如果仍在创建Deployment,则输出类似于:
  1. [root@master ~]# kubectl get deployment
  2. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  3. nginx-deployment   0/3     3            0           25s
  4. # 在检查集群中的Deployment时,所显示的字段有:
  5. NAME:列出了名称空间中Deployment的名称
  6. READY:显示应用程序的可用“副本”数。显示的模式是“就绪个数/期望个数”
  7. UP-TO-DATE:显示为了达到期望状态已经更新的副本数
  8. AVAILABLE:显示应用可供用户使用的副本数
  9. AGE:显示应用程序运行的时间
复制代码


  • 请注意期望数副本数是根据.spec.replicas字段设置3
要想查察Deployment上线状态,运行kubectl rollout status deployment nginx-deployment
  1. [root@master ~]# kubectl rollout status deployment nginx-deployment
  2. deployment "nginx-deployment" successfully rolled out
复制代码
几秒种过再次运行kubectl get deployment输出类似于:
  1. [root@master ~]# kubectl get deployment
  2. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  3. nginx-deployment   3/3     3            3           71m
复制代码
要查察Deployment创建的ReplicaSet(rs),运行kubectl get rs。输出类似于
  1. [root@master ~]# kubectl get rs
  2. NAME                         DESIRED   CURRENT   READY   AGE
  3. nginx-deployment-9456bbbf9   3         3         3       73m
  4. # ReplicaSet输出中包含以下字段:
  5. NAME:列出名称空间中ReplicaSet的名称
  6. DESIRED:显示应用的期望副本个数,即在创建Deployment时所定义的值。此为期望状态
  7. CURRENT:显示当前运行状态中的副本个数
  8. READY:显示应用中有多少副本可以为用户提供服务
  9. AGE:显示应用已经运行的时间长度
复制代码
  1. # 注意:ReplicaSet的名称格式始终为[Deployment 名称]-[哈希]。该名称将成为所创建的Pod的名称基础。其中的 哈希字符串与ReplicaSet上的pod-template-hash标签一致
  2. # Deployment的名字
  3. [root@master ~]# kubectl get deployment
  4. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  5. nginx-deployment   3/3     3            3           77m
  6. # rs的名字
  7. [root@master ~]# kubectl get rs
  8. NAME                         DESIRED   CURRENT   READY   AGE
  9. nginx-deployment-9456bbbf9   3         3         3       77m
复制代码
要查察每个Pod自动天生的标签,运行kubectl get pod --show-labels。输出类似于
  1. [root@master ~]# kubectl get pod
  2. --show-labels
  3. NAME                               READY   STATUS    RESTARTS   AGE   LABELS
  4. nginx-deployment-9456bbbf9-j855n   1/1     Running   0          78m   app=nginx,pod-template-hash=9456bbbf9
  5. nginx-deployment-9456bbbf9-kzxkw   1/1     Running   0          78m   app=nginx,pod-template-hash=9456bbbf9
  6. nginx-deployment-9456bbbf9-twsbk   1/1     Running   0          78m   app=nginx,pod-template-hash=9456bbbf9
复制代码
2.2、说明

你必须在Deployment中指定得当的选择算符和Pod模板标签(在本例中为app:nginx)。标签大概选择算符不要与其他控制器(包括其他Deployment和StatefulSet)重叠。Kubernetes不会组织你如许做,但是如果多个控制器具有重叠的选择算符,它们大概会发生冲突实行难以预料的操作。
2.3、Pod-template-hash标签

注意:不要更改此标签
Deployment控制器将pod-template-hash标签添加到Deployment所创建或收留的每个ReplicaSet
此标签可确保Deployment的子ReplicaSet不重叠。标签是通过对ReplicaSet的podTemplate举行哈希处理。所天生的哈希值被添加到ReplicaSet选择算符、Pod模板标签,并存在于ReplicaSet大概拥有的任何现有Pod中
三、更新Deployment

说明:仅当Deployment Pod模板(即.spec.template)发生该表时,比方模板的标签或容器镜像被更新,才会触发Deployment上线。其他更新(如对Deployment实行扩缩容的操作)不会指出上线动作。
3.1、更新Nginx版本

再实行以下操作之前,可以先查察目前的nginx版本
  1. [root@master ~]# kubectl exec -it nginx-deployment-9456bbbf9-j855n -- nginx -v
  2. nginx version: nginx/1.14.2
复制代码
先来更新nginx Pod以使用nginx:1.16.1镜像,而不是nginx:1.14.2镜像
  1. [root@master ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.16.1
复制代码
在这里,deployment nginx-deployment表明Deployment的名称,nginx表明必要举行更新的容器,而nginx:1.16.1则表示镜像的心版本
输出类似于:
  1. deployment.apps/nginx-deployment image updated
复制代码
大概,可以对Deployment实行edit操作并将.spec.template.spec.containers.image从nginx:1.14.2更改值nginx:latest最新版本
  1. [root@master ~]# kubectl edit deployment nginx-deployment
  2. spec:
  3.       containers:
  4.       - image: nginx:latest
  5.         imagePullPolicy: IfNotPresent
  6.         name: nginx
  7. ...
复制代码
3.2、查察上线状态

要查察上线状态,运行:
  1. [root@master ~]# kubectl rollout status deployment nginx-deployment
复制代码
输出类似于
  1. Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
复制代码
大概
  1. deployment "nginx-deployment" successfully rolled out
复制代码
获取关于已更新的Deployment的更多信息


  • 在上线成功后,可以通过运行kubectl get deployment来查察Deployment:输出类似于:
  1. [root@master ~]# kubectl get deployment
  2. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  3. nginx-deployment   3/3     3            3           110m
复制代码


  • 运行kubectl get rs以查察Deployment通过创建新的ReplicaSet并将其扩容到3个副本并将旧ReplicaSet缩容到0个副本完成了Pod的更新操作:
  1. [root@master ~]# kubectl get rs
  2. NAME                         DESIRED   CURRENT   READY   AGE
  3. nginx-deployment-67dffbbbb   3         3         3       2m52s
  4. nginx-deployment-9456bbbf9   0         0         0       111m
复制代码


  • 现在运行kubectl get pod应该显示新的Pod:
  1. [root@master ~]# kubectl get pod
  2. NAME                               READY   STATUS    RESTARTS   AGE
  3. nginx-deployment-67dffbbbb-2dgln   1/1     Running   0          3m54s
  4. nginx-deployment-67dffbbbb-kmsbr   1/1     Running   0          3m55s
  5. nginx-deployment-67dffbbbb-sg672   1/1     Running   0          3m56s
复制代码
下次要更新这些Pod时,只必要再次更新Deployment模板即可。
Deployment可确保在更新时关闭肯定数目的Pod。默认情况下,它确保至少所需Pod的75%处于运行状态(最大不可用比例为25%)。
比方,如果仔细查察上述Deployment,将看到它起首创建了一个新的Pod,然后删除旧的Pod,并创建了新的Pod。它不会杀死旧Pod,直到足够数目的新Pod已经出现。在足够数目的旧Pod被杀死前并没有创建新的Pod。它确保至少3个Pod可用,同时最多总共4个Pod可用。当Deployment设置为4个副本时,Pod的个数会介于3和5之前。


  • 获取Deployment的更多信息
  1. [root@master ~]# kubectl describe deployment
复制代码
输出类似于
  1. Name:                   nginx-deployment
  2. Namespace:              default
  3. CreationTimestamp:      Fri, 26 Jul 2024 15:42:14 +0800
  4. Labels:                 app=nginx
  5. Annotations:            deployment.kubernetes.io/revision: 3
  6. Selector:               app=nginx
  7. Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
  8. StrategyType:           RollingUpdate
  9. MinReadySeconds:        0
  10. RollingUpdateStrategy:  25% max unavailable, 25% max surge
  11. Pod Template:
  12.   Labels:  app=nginx
  13.   Containers:
  14.    nginx:
  15.     Image:        nginx:latest
  16.     Port:         80/TCP
  17.     Host Port:    0/TCP
  18.     Environment:  <none>
  19.     Mounts:       <none>
  20.   Volumes:        <none>
  21. Conditions:
  22.   Type           Status  Reason
  23.   ----           ------  ------
  24.   Available      True    MinimumReplicasAvailable
  25.   Progressing    True    NewReplicaSetAvailable
  26. OldReplicaSets:  <none>
  27. NewReplicaSet:   nginx-deployment-67dffbbbb (3/3 replicas created)
  28. Events:
  29.   Type    Reason             Age    From                   Message
  30.   ----    ------             ----   ----                   -------
  31.   Normal  ScalingReplicaSet  22m    deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 1
  32.   Normal  ScalingReplicaSet  7m43s  deployment-controller  Scaled down replica set nginx-deployment-ff6655784 to 0
  33.   Normal  ScalingReplicaSet  7m43s  deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 1
  34.   Normal  ScalingReplicaSet  7m42s  deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 2
  35.   Normal  ScalingReplicaSet  7m42s  deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 2
  36.   Normal  ScalingReplicaSet  7m41s  deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 1
  37.   Normal  ScalingReplicaSet  7m41s  deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 3
  38.   Normal  ScalingReplicaSet  7m39s  deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 0
复制代码
四、回滚Deployment

4.1、回滚前操作

偶然,你大概想要回滚Deployment;比方,当Deployment不稳定时(比方进入反复崩溃状态)。默认情况下,Deployment的全部上线记录都保留在系统中,以便可以随时回滚(你可以通过修改修订历史限定来更新这一越苏)
说明:Deployment被触发上线时,系统就会创建Deployment的新的修订版本。这意味着仅当Deployment的Pod模板(.spec.template)发生更改时,才会创建新的修订版本–比方,模板的标签或容器镜像发生变化。其他更新,如Deployment的扩缩容器操作不会创建Deployment修订版本。这是为了方便同时实行手动缩放或自动缩放,换言之,当你回滚到较早的修订版本时,只有Deployment的Pod模板部署会被回滚。


  • 假设你在更新Deployment时犯了一个拼写错误,将镜像名称命名设置为nginx:1.161而不是nginx:1.16.1
  1. [root@master ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.161
复制代码
输出类似于:
  1. deployment.apps/nginx-deployment image updated
复制代码


  • 此上线进程会出现停滞,你可以通过查抄上线状态来验证:
  1. [root@master ~]# kubectl rollout status deployment nginx-deployment
复制代码
输出类似于
  1. Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
复制代码


  • 按Ctrl-C制止上述上线状态观察
  • 你可以看到旧的副本有3个,新的副本有1个
  1. [root@master ~]# kubectl get rs
  2. NAME                          DESIRED   CURRENT   READY   AGE
  3. nginx-deployment-5b4685b9bd   1         1         0       3m56s
  4. nginx-deployment-67dffbbbb    3         3         3       20m
  5. nginx-deployment-9456bbbf9    0         0         0       128m
复制代码


  • 查察所创建的Pod,你会注意到新ReplicaSet所创建的1个Pod卡顿在镜像拉取循环中
  1. [root@master ~]# kubectl get pod
复制代码
输出类似于:
  1. NAME                                READY   STATUS             RESTARTS   AGE
  2. nginx-deployment-5b4685b9bd-lm4jj   0/1     ImagePullBackOff   0          5m21s
  3. nginx-deployment-67dffbbbb-2dgln    1/1     Running            0          21m
  4. nginx-deployment-67dffbbbb-kmsbr    1/1     Running            0          21m
  5. nginx-deployment-67dffbbbb-sg672    1/1     Running            0          21m
复制代码
说明:Deployment控制器自动制止有题目的上线过程,并制止对新的ReplicaSet扩容。这行为取决于所指定的rollingUpdate参数(具体为maxUnavailable)。默认情况下,Kubernetes将此值设置为25%


  • 获取Deployment描述信息:
  1. [root@master ~]# kubectl describe deployment
复制代码
输出类似于:
  1. Name:                   nginx-deployment
  2. Namespace:              default
  3. CreationTimestamp:      Fri, 26 Jul 2024 15:42:14 +0800
  4. Labels:                 app=nginx
  5. Annotations:            deployment.kubernetes.io/revision: 4
  6. Selector:               app=nginx
  7. Replicas:               3 desired | 1 updated | 4 total | 3 available | 1 unavailable
  8. StrategyType:           RollingUpdate
  9. MinReadySeconds:        0
  10. RollingUpdateStrategy:  25% max unavailable, 25% max surge
  11. Pod Template:
  12.   Labels:  app=nginx
  13.   Containers:
  14.    nginx:
  15.     Image:        nginx:1.161
  16.     Port:         80/TCP
  17.     Host Port:    0/TCP
  18.     Environment:  <none>
  19.     Mounts:       <none>
  20.   Volumes:        <none>
  21. Conditions:
  22.   Type           Status  Reason
  23.   ----           ------  ------
  24.   Available      True    MinimumReplicasAvailable
  25.   Progressing    True    ReplicaSetUpdated
  26. OldReplicaSets:  nginx-deployment-67dffbbbb (3/3 replicas created)
  27. NewReplicaSet:   nginx-deployment-5b4685b9bd (1/1 replicas created)
  28. Events:
  29.   Type    Reason             Age    From                   Message
  30.   ----    ------             ----   ----                   -------
  31.   Normal  ScalingReplicaSet  39m    deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 1
  32.   Normal  ScalingReplicaSet  24m    deployment-controller  Scaled down replica set nginx-deployment-ff6655784 to 0
  33.   Normal  ScalingReplicaSet  24m    deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 1
  34.   Normal  ScalingReplicaSet  24m    deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 2
  35.   Normal  ScalingReplicaSet  24m    deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 2
  36.   Normal  ScalingReplicaSet  24m    deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 1
  37.   Normal  ScalingReplicaSet  24m    deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 3
  38.   Normal  ScalingReplicaSet  24m    deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 0
  39.   Normal  ScalingReplicaSet  7m44s  deployment-controller  Scaled up replica set nginx-deployment-5b4685b9bd to 1
复制代码
要办理此题目,必要回滚到以前稳定的Deployment版本
4.2、查抄Deployment上线历史

4.2.1、查察修订历史

  1. [root@master ~]# kubectl rollout history deployment nginx-deployment
复制代码
输出类似于:
  1. deployment.apps/nginx-deployment
  2. REVISION  CHANGE-CAUSE
  3. 1         <none>
  4. 2         <none>
  5. 3         <none>
  6. 4         <none>
复制代码
CHANGE-CAUSE的内容是从Deployment的kubernetes.io/change-cause注解复制过来的。复制动作发生在修订版本创建时。
4.2.2、查察修订历史的具体信息



  • 以下命令将查察修订版本2的具体信息
  1. [root@master ~]# kubectl rollout history deployment nginx-deployment
  2. --revision=2
复制代码
输出类似于:
  1. deployment.apps/nginx-deployment with revision #2
  2. Pod Template:
  3.   Labels:        app=nginx
  4.         pod-template-hash=ff6655784
  5.   Containers:
  6.    nginx:
  7.     Image:        nginx:1.16.1
  8.     Port:        80/TCP
  9.     Host Port:        0/TCP
  10.     Environment:        <none>
  11.     Mounts:        <none>
  12.   Volumes:        <none>
复制代码
4.2.3、回滚到之前的修订版本

按照下面给出的步骤将Deployment从当前版本回滚到以前的版本(即版本2)


  • 假定现在你已经决定撤销当前上线版本回滚到之前的修订版本:
  1. [root@master ~]# kubectl rollout undo deployment nginx-deployment --to-revision=2
复制代码
输出类似于:
  1. deployment.apps/nginx-deployment rolled back
复制代码


  • 查抄回滚是否成功以及Deployment是否正在运行
  1. [root@master ~]# kubectl get deployment nginx-deployment
复制代码
输出类似于:
  1. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  2. nginx-deployment   3/3     3            3           3h43m
复制代码


  • 获取Deployment描述信息:
  1. [root@master ~]# kubectl describe deployment
  2. nginx-deployment
复制代码
输出类似于:
  1. Name:                   nginx-deployment
  2. Namespace:              default
  3. CreationTimestamp:      Fri, 26 Jul 2024 15:42:14 +0800
  4. Labels:                 app=nginx
  5. Annotations:            deployment.kubernetes.io/revision: 5
  6. Selector:               app=nginx
  7. Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
  8. StrategyType:           RollingUpdate
  9. MinReadySeconds:        0
  10. RollingUpdateStrategy:  25% max unavailable, 25% max surge
  11. Pod Template:
  12.   Labels:  app=nginx
  13.   Containers:
  14.    nginx:
  15.     Image:        nginx:1.16.1
  16.     Port:         80/TCP
  17.     Host Port:    0/TCP
  18.     Environment:  <none>
  19.     Mounts:       <none>
  20.   Volumes:        <none>
  21. Conditions:
  22.   Type           Status  Reason
  23.   ----           ------  ------
  24.   Available      True    MinimumReplicasAvailable
  25.   Progressing    True    NewReplicaSetAvailable
  26. OldReplicaSets:  <none>
  27. NewReplicaSet:   nginx-deployment-ff6655784 (3/3 replicas created)
  28. Events:
  29.   Type    Reason             Age    From                   Message
  30.   ----    ------             ----   ----                   -------
  31.   Normal  ScalingReplicaSet  131m   deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 1
  32.   Normal  ScalingReplicaSet  115m   deployment-controller  Scaled down replica set nginx-deployment-ff6655784 to 0
  33.   Normal  ScalingReplicaSet  115m   deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 1
  34.   Normal  ScalingReplicaSet  115m   deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 2
  35.   Normal  ScalingReplicaSet  115m   deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 2
  36.   Normal  ScalingReplicaSet  115m   deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 1
  37.   Normal  ScalingReplicaSet  115m   deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 3
  38.   Normal  ScalingReplicaSet  115m   deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 0
  39.   Normal  ScalingReplicaSet  99m    deployment-controller  Scaled up replica set nginx-deployment-5b4685b9bd to 1
  40.   Normal  ScalingReplicaSet  3m55s  deployment-controller  Scaled down replica set nginx-deployment-5b4685b9bd to 0
  41.   Normal  ScalingReplicaSet  3m55s  deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 1
  42.   Normal  ScalingReplicaSet  3m10s  deployment-controller  Scaled down replica set nginx-deployment-67dffbbbb to 2
  43.   Normal  ScalingReplicaSet  3m10s  deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 2
  44.   Normal  ScalingReplicaSet  2m30s  deployment-controller  Scaled down replica set nginx-deployment-67dffbbbb to 1
  45.   Normal  ScalingReplicaSet  2m30s  deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 3
  46.   Normal  ScalingReplicaSet  2m28s  deployment-controller  Scaled down replica set nginx-deployment-67dffbbbb to 0
复制代码
回复

使用道具 举报

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

本版积分规则

登录后关闭弹窗

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

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

GMT+8, 2026-11-14 09:20 , Processed in 0.036726 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

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